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 相关文章推荐
做网页的一些技巧(续)
Feb 01 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
js读取被点击次数的简单实例(从数据库中读取)
Mar 07 Javascript
解析浏览器端的AJAX缓存机制
Jun 21 Javascript
浅谈对Angular中的生命周期钩子的理解
Jul 31 Javascript
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
Jan 22 jQuery
浅析vue-router jquery和params传参(接收参数)$router $route的区别
Aug 03 jQuery
vue使用高德地图点击下钻上浮效果的实现思路
Oct 12 Javascript
微信小程序 scroll-view 实现锚点跳转功能
Dec 12 Javascript
vue实现表单未编辑或未保存离开弹窗提示功能
Apr 08 Javascript
ant-design-vue按需加载的坑的解决
May 14 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获取twitter最新消息的方法
2015/04/14 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
js对象关系图 方便dom操作
2012/03/18 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
javascript解析ajax返回的xml和json格式数据实例详解
2017/01/05 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
解决vue v-for 遍历循环时key值报错的问题
2018/09/06 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
[04:26]2014DOTA2西雅图国际邀请赛 总决赛TOPPLAY
2014/07/22 DOTA
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
学习Python selenium自动化网页抓取器
2018/01/20 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
python利用Tesseract识别验证码的方法示例
2019/01/21 Python
Opencv+Python实现图像运动模糊和高斯模糊的示例
2019/04/11 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
Django接收照片储存文件的实例代码
2020/03/07 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
党校培训自我鉴定
2014/02/01 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
集结号观后感
2015/06/08 职场文书
想创业成功,需要掌握这些要点
2019/12/06 职场文书