NaN
JavaScript中有一个特殊的对象:NaN
,它表示一个非法的数字(Not-a-Number)。这个对象十分特殊,它的类型是number
,属于原始值,但是和自身不相等。即NaN === NaN
返回false
。
NaN和自身不相等,乍一看违反直觉,但却符合IEEE754的规定。IEEE754的委员会成员曾经解释过将NaN设计为不等的权衡。
isNaN
由于NaN
的特殊性,我们经常需要判断一个值是否为NaN,通常我们使用isNaN
来判断,例如:
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
isNaN(true); // false
isNaN(null); // false
isNaN(1); // false
如果说NaN
是JavaScript的一个坑的话,isNaN
就是另一个坑了。因为isNaN
会先将传递给它的对象转化为数字类型。而我们知道,对于普通的字符串,转化为数字类型会返回NaN
。于是就踩坑了。。。
isNaN("1"); // fales "1" 被转化为数字 1,因此返回false
isNaN("SegmentFault"); // true "SegmentFault" 被转化成数字 NaN
所以说,通常对字符串使用isNaN
方法会返回true
,isNaN
坑爹了——当然,isNaN
也许会辩驳说这不是它的坑,这是JavaScript强制类型转换的坑。
那么,可不可以不做类型转换直接判断呢?ES6用Number.isNaN
填上了这个坑。Number.isNaN
不会转换对象的类型。
Number.isNaN('SegmentFault'); // false
ES6的这个新特性,已经被NodeJS和部分浏览器所支持。
编撰 SegmentFault