概述
在JavaScript的数字类型Number中,我们最常使用的大概是整数类型与浮点数类型,但除这两者外,还有个特殊的存在NaN,为什么NaN!==NaN?我们如何判断一个值是否等于NaN呢?这篇文章好好聊聊NaN。
1.NaN是什么?
NaN全称是Not-A-Number(不是一个数字),我们可以通过Number.NaN来获得一个NaN,在类型转换失败时,我们常常会得到一个NaN,需要注意的是,NaN是JS中唯一一个自身不相等的存在。
Number.NaN //NaN
NaN === NaN //false
2.为什么NaN!==NaN?
NaN只是Number上的一个静态属性。
Number('echo') //NaN
比如Number('echo')会得到NaN,它只是为了告诉你这个值不是一个数字,一种表示方法,而非一个精准有效的值,因此NaN不能参与计算,也无法与自身比较。
3.什么情况下产生NaN
当Number提供的类型转换方法在解析一个值却无法返回数字时:
Number('echo') //NaN
parseInt('echo123') //NaN
parseInt('123echo') //123
parseFloat('时间跳跃123.1') //NaN
parseFloat('123.1时间跳跃') //123.1
计算中使用- / *运算符,参与计算的值转换类型失败时:
1 - '听风是风' //NaN
1 * '123时间跳跃' //NaN
1 / 'echo123' //NaN
特别注意,两个数字0相除也会得到NaN:
0 / 0 //NaN
4.isNaN方法的含义,如何判断一个值严格等于NaN
window上有一个全局方法isNaN(),可能大分部人习惯理解此方法为判断一个值是等于NaN,这是因为is NaN直译就是“是不是NaN”所带来的误解,其实本意不是这样:
isNaN(123) //false
isNaN('123时间跳跃') //true
isNaN(NaN) //true
当我们向isNaN传递一个参数,它的本意是通过Number()方法尝试转换参数的类型为Number,如果转换成功返回false,否则转返回true,它只是判断这个参数能否转成数字而已,并不是判断是否严格等于NaN。
所以当你要判断某个值是否严格等于NaN时无法使用isNaN()方法,毕竟你传递任意字符串它都会返回true。
ES6中提供了一个Number.isNaN()方法用于判断一个值是否严格等于NaN:
Number.isNaN(NaN)//true
与isNaN最大的区别是,Number.isNaN不存在转换类型的行为,这点是最大的不同:
isNaN(NaN) //true
Number.isNaN(NaN) //true
isNaN('听风是风') //true
Number.isNaN('听风是风') //false
我们在前面说过,NaN是唯一一个与自身不相等的特殊值,如果你觉得Number.isNaN存在兼容问题,也可以利用这个特点自己定义验证方法:
const ISNAN = (value) => value !== value;
ISNAN('听风是风'); //false
ISNAN(123); //false
ISNAN(NaN); //true
2021.3.29补 如何判断两个NaN相等
在ES5中提供了Object.is()方法,用于判断两个值是否属于同一个值,而此方法可用于NaN是否相等的判断,比如
Object.is(NaN, NaN);// true
Object.is()接受两个参数,此API详情可见MDN也就是用于做比较的两个参数,这里做个简单补充。
参考资料:
JavaScript中的 NaN 与 isNaN
MDN--NaN
MDN--isNaN
最后
以上就是动人微笑为你收集整理的js中的NaN,isNaN与Number.isNaN的区别,如何判断一个值严格等于NaN的全部内容,希望文章能够帮你解决js中的NaN,isNaN与Number.isNaN的区别,如何判断一个值严格等于NaN所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复