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分页函数代码
Sep 10 Javascript
JavaScript字符串插入、删除、替换函数使用示例
Jul 25 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
Mar 21 Javascript
Javascript原型链和原型的一个误区
Oct 22 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
Jun 13 Javascript
javascript数据结构中栈的应用之符号平衡问题
Apr 11 Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 Javascript
浅谈从React渲染流程分析Diff算法
Sep 08 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
Nov 15 Javascript
JavaScript事件对象深入详解
Dec 30 Javascript
在Create React App中启用Sass和Less的方法示例
Jan 16 Javascript
Ajax请求时无法重定向的问题解决代码详解
Jun 21 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
火车头discuz6.1 完美采集的php接口文件
2009/09/13 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
JavaScript 面向对象编程(1) 基础
2010/05/18 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
JQuery做的一个简单的点灯游戏分享
2014/07/16 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
node.js中的dns.getServers方法使用说明
2014/12/08 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
jquery图片切换实例分析
2015/04/15 Javascript
jQuery进行组件开发完整实例
2015/12/15 Javascript
js获取本机操作系统类型的两种方法
2015/12/19 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
JS前端加密算法示例
2016/12/22 Javascript
canvas 弹幕效果(实例分享)
2017/01/11 Javascript
判断jQuery是否加载完成,没完成继续判断的解决方法
2017/12/06 jQuery
webpack 样式加载的实现原理
2018/06/12 Javascript
JS实现点击li标签弹出对应的索引功能【案例】
2019/02/18 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
Nodejs实现图片上传、压缩预览、定时删除功能
2019/10/25 NodeJs
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
js实现缓动动画
2020/11/25 Javascript
[36:33]完美世界DOTA2联赛循环赛 Matador vs Forest 第一场 11.06
2020/11/06 DOTA
python通过socket查询whois的方法
2015/07/18 Python
python利用rsa库做公钥解密的方法教程
2017/12/10 Python
初探TensorFLow从文件读取图片的四种方式
2018/02/06 Python
python修改txt文件中的某一项方法
2018/12/29 Python
在python3中pyqt5和mayavi不兼容问题的解决方法
2019/01/08 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
Python环境使用OpenCV检测人脸实现教程
2020/10/19 Python
写一个方法1000的阶乘
2012/11/21 面试题
英文邀请函
2015/02/02 职场文书
家庭暴力离婚起诉书
2015/05/18 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript