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 相关文章推荐
ajax 缓存 问题 requestheader
Aug 01 Javascript
node.js中的url.resolve方法使用说明
Dec 10 Javascript
jQuery 和 CSS 的文本特效插件集锦
Dec 12 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
Mar 03 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
Jan 18 Javascript
JS动态给对象添加事件的简单方法
Jul 19 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
Aug 04 Javascript
微信小程序 删除项目工程实现步骤
Nov 10 Javascript
vue项目打包之后背景样式丢失的解决方案
Jan 17 Javascript
VUE异步更新DOM - 用$nextTick解决DOM视图的问题
Nov 06 Javascript
node.js如何自定义实现一个EventEmitter
Jul 16 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
解析如何修改phpmyadmin中的默认登陆超时时间
2013/06/25 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
2015/03/04 PHP
PHP单例模式详细介绍
2015/07/01 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
PHP常用技巧汇总
2016/03/04 PHP
php blowfish加密解密算法
2016/07/02 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
2017/05/08 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
PHP Web表单生成器案例分析
2020/06/02 PHP
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
把jquery 的dialog和ztree结合实现步骤
2013/08/02 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
2015/09/14 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
酷! 不同风格页面布局幻灯片特效js实现
2021/02/19 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
Javascript 实现匿名递归的实例代码
2017/05/25 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
关于js陀螺仪的理解分析
2019/04/11 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
针对Vue路由history模式下Nginx后台配置操作
2020/10/22 Javascript
python tkinter实现彩球碰撞屏保
2019/07/30 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
二手书店创业计划书
2014/01/16 职场文书
中文教师求职信
2014/02/22 职场文书
债务纠纷起诉书
2015/05/20 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书
图解上海144收音机
2021/04/22 无线电
html2 canvas svg不能识别的解决方案
2021/06/03 HTML / CSS
Python图片验证码降噪和8邻域降噪
2021/08/30 Python
MySQL导致索引失效的几种情况
2022/06/25 MySQL