一元加,一元减和NaN的判断
2017-10-12 本文已影响19人
殷灬商
看了一个JS的小东西,就是一元加符号,实际之前也用过,类似隐式类型转换,简单整理一下
1.数字字符串的转换
数字字符串转换成纯数字的方法有很多,比如使用parseInt,或者用变量减0,通过隐式类型转换的方式进行操作,现在也可以通过一元加来操作
var str = "20";
console.log(typeof +str); // Number
当然这种方式对数字类型是无效的,只适用于纯数字字符串,如果字符串带字符的话,转化的结果是NaN,这种情况还是parseInt比较稳妥,不会出现一些烂七八糟的问题
它还支持字符串是十六进制的转换,可以直接转换成对应十进制的数字,并且是Number类型,但是不支持二进制和八进制
var str1 = "0x1a1";
console.log(+str1); // 417
一元减用法类似,就是把初始值变成负数
2.日期对象的转换
当创建一个日期对象的时候,可以直接通过一元加变成这个对象对应的时间戳,省了getTime()这个步骤
var aa = +new Date();
console.log(aa); // 1507803182407
3.NaN的严格判断
在处理各种转换的时候,难免会碰见NaN,而判断NaN的方法有,但是都不是很准确.
首先在不能使用===或者==来判断,哪怕NaN === NaN返回的结果都是false.
其次,使用提供的isNaN()进行校验,但是会发现这个方法只适用于纯数字,会返回false,但是要是对字符串,undefined,等进行校验的时候都会返回true,原因是在进行判断之前,先进行了一次隐式类型转换,字符串在转换之后都变成了NaN,从而造成这个方法准确度出现问题
所以综上,为了能准确的判断NaN,先找到NaN特性,因为它本身是number,而且isNaN()本身对纯数字有效,所以要避免像字符串等变量进行隐式类型转换,参照如下
function checkNaN(value){
return typeof value === 'number' && isNaN(value);
}
这个不严谨的问题到了ES6终于有了妥善的解决方式,ES6拓展了Number的方法,如果在判断NaN话可以使用新的系统方法了
console.log(Number.isNaN("你好")); // false
console.log(Number.isNaN(666)) // false
效果和之前我们写的checkNaN一样,感谢国平的提醒
最后一句,笑渐不闻声渐悄。多情却被无情恼