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 相关文章推荐
utf8的编码算法 转载
Dec 27 Javascript
JavaScript中实现块作用域的方法
Apr 01 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
Aug 11 Javascript
js防止表单重复提交实现代码
Sep 05 Javascript
对于this和$(this)的个人理解
Sep 08 Javascript
js计算两个时间之间天数差的实例代码
Nov 19 Javascript
Sublime Text 3常用插件及安装方法
Dec 16 Javascript
Jquery和Js获得元素标签名称的方法总结
Oct 08 Javascript
ES6中Proxy代理用法实例浅析
Apr 06 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
May 26 Javascript
基于zepto.js实现登录界面
Oct 09 Javascript
JavaScript设计模式之单例模式简单实例教程
Jul 02 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
1.PHP简介
2006/10/09 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
利用Laravel事件系统如何实现登录日志的记录详解
2017/05/20 PHP
javascript 添加和移除函数的通用方法
2009/10/20 Javascript
使用JS进行目录上传(相当于批量上传)
2010/12/05 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
AngularJS directive返回对象属性详解
2016/03/28 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
python高阶爬虫实战分析
2018/07/29 Python
python批量下载抖音视频
2019/06/17 Python
python数据分析工具之 matplotlib详解
2020/04/09 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
CSS3制作酷炫的条纹背景
2017/11/09 HTML / CSS
美国花布包包品牌:Vera Bradley
2017/08/11 全球购物
英国时尚运动品牌的合集:The Sports Edit
2017/12/20 全球购物
迷你分体式空调:SoGoodToBuy
2018/08/07 全球购物
荷兰时尚精品店:Labels Fashion
2020/03/22 全球购物
PHP开发的一般流程
2013/08/13 面试题
您熟悉ORM(Object-Relation Mapping)吗?请谈谈您所理解的ORM
2016/02/08 面试题
综合测评自我鉴定
2013/10/08 职场文书
应届生找工作求职信
2014/06/24 职场文书
软环境建设心得体会
2014/09/09 职场文书
离婚协议书范本2014
2014/10/27 职场文书
python编程简单几行代码实现视频转换Gif示例
2021/10/05 Python
python实现学员管理系统(面向对象版)
2022/06/05 Python