NaN / Number.NaN
全局属性 NaN
的值表示不是一个数字(Not-A-Number), NaN 属性的初始值就是 NaN,和 Number.NaN
的值一样。
在现代浏览器中(ES5中),NaN
属性是一个不可配置(non-configurable),不可写(non-writable),不可枚举(non-enumerable)的属性。
编码中很少直接使用到 NaN
。通常都是在计算失败时,作为 Math 的某个方法的返回值出现的或者尝试将一个字符串解析成数字但失败了的时候。
等号运算符(==
和 ===)
不能被用来判断一个值是否是 NaN,
必须使用 Number.isNaN()
或 isNaN()
函数。在执行自比较之中:NaN,也只有NaN,比较之中不等于它自己。
NaN === NaN; // false Number.NaN === NaN; // false isNaN(NaN); // true isNaN(Number.NaN); // true function valueIsNaN(m) { return m !== m; } valueIsNaN(1); // false valueIsNaN(NaN); // true valueIsNaN(Number.NaN); // true
isNaN() / Number.isNaN()
isNaN()
函数用来确定一个值是否为NaN
。isNaN
函数可以通过ECMAScript 2015/ES6 中定义的Number.isNaN()
或者 可以使用typeof
来判断该值是否为一个非数字。
当算术运算返回一个未定义的或无法表示的值时,NaN就产生了。但是,NaN
并不一定用于表示某些值超出表示范围的情况。将某些不能强制转换为数值的非数值转换为数值的时候,也会得到NaN
。比如用 0 除0的情况。
与 JavaScript 中其他的值不同,NaN
不能通过相等操作符(== 和 ===)来判断 ,因为 NaN == NaN
和 NaN === NaN
都会返回 false
。 因此,isNaN
就很有必要了。
isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果,以判断它们表示的是否是合法的数字。
isNaN(NaN); // true isNaN(undefined); // true isNaN({}); // true isNaN(true); // false isNaN(null); // false isNaN(37); // false // strings isNaN("37"); // false: 可以被转换成数值37 isNaN("37.37"); // false: 可以被转换成数值37.37 isNaN("37,5"); // true isNaN('123ABC'); // true: parseInt("123ABC")的结果是 123, 但是Number("123ABC")结果是 NaN isNaN(""); // false: 空字符串被转换成0 isNaN(" "); // false: 包含空格的字符串被转换成0 // dates isNaN(new Date()); // false isNaN(new Date().toString()); // true isNaN("blabla") // true: "blabla"不能转换成数值 // 转换成数值失败, 返回NaN