NaN
好久没有复习过 NaN 了,现在来温故知新!
NaN
NaN 表示 Not A Number
NaN 属性的属性特性: | |
---|---|
writable | false |
enumerable | false |
configurable | false |
NaN
属性的初始值就是 NaN,和 Number.NaN
的值一样。在现代浏览器中(ES5 中), NaN
属性是一个不可配置(non-configurable),不可写(non-writable)的属性。
NaN
如果通过 ==
、 !=
、 ===
、以及 !==
与其他任何值比较都将不相等 – 包括与其他 NaN
值进行比较。必须使用 Number.isNaN()
或 isNaN()
函数。在执行自比较之中:也只有 NaN
不等于它自己。
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
注意点
typeof NaN === "number" // true ,虽然 NaN 是“Not a Number”,但是它的类型还是数值类型
NaN === NaN; // false, NaN 和任何东西都不相等——甚至是它自己本身
NaN == NaN // false
// 0 除以 0 会返回NaN —— 但是其他数除以 0 则不会返回NaN
/**
如果isNaN函数的参数不是Number类型, isNaN函数会首先尝试将这个参数转换为数值,然后才会对转换后的结果是否是NaN进行判断。因此,对于能被强制转换为有效的非 NaN 数值来说(空字符串和布尔值分别会被强制转换为数值 0 和 1),返回false值也许会让人感觉莫名其妙
*/
isNaN('') === false
isNaN(true) === false
// isNaN函数其实等同于回答了这样一个问题:被测试的值在被强制转换成数值时会不会返回 IEEE-754 中所谓的“不是数值(not a number)”。
Number(undefined) === NaN
isNaN(undefined); // true
isNaN({}); // true
Number(null) === 0
isNaN(null); // false
Number(34.23) === 34.23
parseInt("123ABC") === 123
Number("123ABC") === NaN
isNaN(""); // false: 空字符串被转换成 0
isNaN(" "); // false: 包含空格的字符串被转换成 0
undefined +1 // NaN
isNaN(NaN); // true
isNaN('A String'); // true
isNaN(undefined); // true
isNaN({}); // true
Number.isNaN(NaN); // true
Number.isNaN('A String'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
NaN
并不一定用于表示某些值超出表示范围的情况。将某些不能强制转换为数值的非数值转换为数值的时候,也会得到NaN
。
实现 isNaN 函数:
var isNaN = function(value) {
var n = Number(value);
return n !== n;
};
Number.isNaN与isNaN的区别
isNaN(undefined) // true
Number.isNaN(undefined) //false
如果要判断一个值是否严格等于NaN,全局的isNaN
貌似就无法做到了,因为传进去任何不能转化成数字的值,都会得到true
。因为全局的isNaN
会把传入的值做类型转换,先转换成数字型,再判断是否==NaN
。
注意 isNaN()
和 Number.isNaN()
之间的区别:如果当前值是 NaN
,或者将其强制转换为数字后将是 NaN
,则前者将返回 true
。而后者仅当值当前为 NaN
时才为 true
:
isNaN('hello world'); // true
Number.isNaN('hello world'); // false
总结:就是 isNaN 会先调用 Number(参数)看能不能转换数字类型,然后再进行判断,但是 Number.isNaN 就不会做任何的隐式转化