1

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方法会返回trueisNaN坑爹了——当然,isNaN也许会辩驳说这不是它的坑,这是JavaScript强制类型转换的坑。

那么,可不可以不做类型转换直接判断呢?ES6用Number.isNaN填上了这个坑。Number.isNaN不会转换对象的类型。

Number.isNaN('SegmentFault');  // false

ES6的这个新特性,已经被NodeJS和部分浏览器所支持。


编撰 SegmentFault


思否编辑部
4.3k 声望116.9k 粉丝

思否编辑部官方账号,欢迎私信投稿、提供线索、沟通反馈。