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 相关文章推荐
用javascript实现的仿Flash广告图片轮换效果
Apr 24 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
Apr 02 Javascript
De facto standard 世界上不可思议的事实标准
Aug 29 Javascript
javascript定义函数的方法
Dec 06 Javascript
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
Feb 27 Javascript
Jquery图形报表插件 jqplot简介及参数详解
Oct 10 Javascript
在jquery中combobox多选的不兼容问题总结
Dec 24 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
AngularJS 过滤器(自带和自建)详解
Sep 19 Javascript
js 中获取制定的cook信息实现方法
Nov 19 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
Sep 22 jQuery
vue封装swiper代码实例解析
Oct 08 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
mysql5详细安装教程
2007/01/15 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
使用phpQuery采集网页的方法
2013/11/13 PHP
培养自己的php编码规范
2015/09/28 PHP
JavaScript入门教程(10) 认识其他对象
2009/01/31 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
Javascript的时间戳和php的时间戳转换注意事项
2013/04/12 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
js中replace的用法总结
2013/12/27 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
js获取时间函数及扩展函数的方法
2016/10/30 Javascript
浅谈layer的iframe弹窗给里面的标签赋值的问题
2016/11/10 Javascript
JS中传递参数的几种不同方法比较
2017/01/20 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
python merge、concat合并数据集的实例讲解
2018/04/12 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
Django中日期处理注意事项与自定义时间格式转换详解
2018/08/06 Python
python导入坐标点的具体操作
2019/05/10 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
Pandas将列表(List)转换为数据框(Dataframe)
2020/04/24 Python
S’well Bottle保温杯官网:绝缘不锈钢水瓶
2018/05/09 全球购物
护士试用期自我鉴定
2014/02/08 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
知识竞赛拉拉队口号
2014/06/16 职场文书
2016年春节慰问信息
2015/03/25 职场文书
产品调价通知函
2015/04/20 职场文书
歌咏比赛主持词
2015/06/29 职场文书
在酒桌上的敬酒词
2015/08/12 职场文书
Python OpenCV超详细讲解基本功能
2022/04/02 Python