Javascript中常用类型的格式化方法小结


Posted in Javascript onDecember 26, 2016

前言

相信大家都知道因为JavaScript是弱类型的语言,项目写大了会非常难以把控,容易出各种问题。幸好有强类型的TypeScript可以很大程度上弥补这一缺陷,但TypeScript提供的强类型是编译阶段的,虽然绝大部分类型相关的问题在编译阶段都能被覆盖到,但对于小部分在运行时才会出错的错误还是无能为力。

例如以下几种常见的情况:

     1、定义为number的属性,赋值的时候,如果赋值源没有定义强类型,这样就会绕过编译检查的阶段,到运行时发现可能传进来的是个字符串。类内部再一顿加减乘除,很容易导致一大片数据全都被污染为NaN。

     2、定义boolean类型的属性,经常会赋值为一个对象,虽然运行起来不会出明显问题,但其实只想存储一下对象是否为空的状态,却有可能导致那个对象始终无法被回收。

     3、定义为整型的属性,比如index。这点即使TS也无能为力,因为TS里也没有int。很容易传入一个浮点数,导致从数组取索引时产生报错。

在JavaScript运行时,任何用法都有可能发生,如果要写出强壮的组件或框架,类似这些问题,都是必须要考虑到的。解决方案就是对于任何来自于外部传入的参数或变量进行格式化,这样只要格式化一次,组件和框架内部就能高效地正常运转,不用再各种特殊判断。

下面列举几种常用类型的高性能格式化方法:

格式化浮点数

value = +value || 0;

测试输出:

function test(value) {
 value = +value || 0;
 return value;
}

test("123"); //123
test("123.5"); //123.5
test(123); //123
test(123.5); //123.5
test("abc"); //0
test("123ab"); //0
test(NaN); //0
test(null); //0
test(undefined); //0

格式化有符号整数(int32)

value = +value | 0;

等价于:

value = ~~value;

测试输出:

function test(value) {
 value = +value | 0;
 return value;
}

test("123"); //123
test("123.5"); //123
test(123); //123
test(123.5); //123
test("-123.5"); //-123
test("abc"); //0
test(NaN); //0
test(null); //0
test(undefined); //0

要特别注意一下:以上这种格式化方式只适用于32位有符号整型数,也就类似其他语言里的int,正整数部分最大只能到2147483647(2^31-1) 。uint32或者更大的int64是不行的,会被截断。具体可以参考这里:按位操作符。通常在其他语言里,可以使用int的场景使用这种格式化方法都完全没问题。

格式化无符号整数(uint32)

value = +value >>> 0;

测试输出:

function test(value) {
 value = +value >>> 0;
 return value;
}

test("123"); //123
test("123.5"); //123
test(0xFFFFFFFF); //0xFFFFFFFF
test(0xFFFFFFFF+).5; //0xFFFFFFFF
test("-123.5"); //0xFFFFFF85
test("abc"); //0
test(NaN); //0
test(null); //0
test(undefined); //0

要注意一下:位移运算符是三个箭头>>>,有且只有这个运算符是操作无符号整型,结果是一个uint32,范围从0~4294967295(2^32-1),其他所有位移运算符的结果都是有符号整型(int32),因此也没法表示大于2147483647(2^31-1)的数字。

格式化布尔值

value = !!value;

测试输出:

function test(value) {
 value = !!value;
 return value;
}

test(true); //true
test(123); //true
test(123.5); //true
test({}); //true
test([]); //true
test("abc"); //true
test(""); //false
test(false); //false
test(NaN); //false
test(null); //false
test(undefined); //false

格式化字符串

字符串的格式化没有那么固定的需求,一般情况下避免null就行了,因为其他对字符串变量的操作,比如加号,都会自动转换类型。

value = value || "";

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用Javascript能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
js prototype 格式化数字 By shawl.qiu
Apr 02 Javascript
js 判断浏览器类型 去全角、半角空格 自动关闭当前窗口
Apr 10 Javascript
原生javascript实现图片滚动、延时加载功能
Jan 12 Javascript
jQuery平滑旋转幻灯片特效代码分享
Sep 07 Javascript
JSON键值对序列化和反序列化解析
Jan 24 Javascript
canvas实现刮刮卡效果
Mar 14 Javascript
AngularJS中$http使用的简单介绍
Mar 17 Javascript
JS触摸事件、手势事件详解
May 04 Javascript
了解JavaScript表单操作和表单域
May 27 Javascript
原生JavaScript实现的无缝滚动功能详解
Jan 17 Javascript
微信小程序用canvas画图并分享
Mar 09 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
Aug 17 Javascript
Angular的自定义指令以及实例
Dec 26 #Javascript
如何提高javascript加载速度
Dec 26 #Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
Dec 26 #Javascript
javascript实现去除HTML标签的方法
Dec 26 #Javascript
解析JavaScript实现DDoS攻击原理与保护措施
Dec 26 #Javascript
JS实现密码框的显示密码和隐藏密码功能示例
Dec 26 #Javascript
原生JS下拉加载插件分享
Dec 26 #Javascript
You might like
php和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
js中if语句的几种优化代码写法
2011/03/12 Javascript
jQuery Deferred和Promise创建响应式应用程序详细介绍
2013/03/05 Javascript
用jquery模仿的a的title属性的例子
2014/10/22 Javascript
jquery实现右键菜单插件
2015/03/29 Javascript
JavaScript数据结构与算法之栈与队列
2016/01/29 Javascript
浅析Javascript的自动分号插入(ASI)机制
2016/09/29 Javascript
jQuery EasyUI 组件加上“清除”功能实例详解
2017/04/11 jQuery
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
2018/01/03 Javascript
javaScript动态添加Li元素的实例
2018/02/24 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
Python入门之modf()方法的使用
2015/05/15 Python
python如何读写json数据
2018/03/21 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
Python中的引用知识点总结
2019/05/20 Python
一行Python代码过滤标点符号等特殊字符
2019/08/12 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
详解python tcp编程
2020/08/24 Python
python 模拟登陆github的示例
2020/12/04 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
财务副总经理工作职责
2013/11/25 职场文书
班级出游活动计划书
2014/08/15 职场文书
十八大标语口号
2014/10/09 职场文书
党支部考察意见范文
2015/06/02 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
Django drf请求模块源码解析
2021/06/08 Python
css样式important规则的正确使用方式
2022/06/10 HTML / CSS
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python