请解释下NaN === NaN的结果
在 JavaScript 中,NaN === NaN
的结果是 false
。
尽管 NaN
代表“非数字”(Not a Number),两个 NaN
之间并不相等。这是 JavaScript 规范中定义的行为,也符合 IEEE 754 浮点数标准。
原因:
NaN
可以由多种不同的非法数学运算产生,例如 0/0
、Infinity - Infinity
、Math.sqrt(-1)
等。虽然它们都表示非数字的结果,但它们并不一定代表相同的“非数字”值。因此,规范规定任何 NaN
与任何值(包括自身)比较都返回 false
。
如何判断一个值是否为 NaN:
由于 NaN
与自身不相等,不能用 value === NaN
来判断一个值是否为 NaN
。正确的方法是使用全局函数 isNaN()
或 Number.isNaN()
:
-
isNaN(value)
: 会先尝试将value
转换为数字,然后再判断是否为NaN
。 如果value
可以被转换为数字,但转换结果是NaN
,则返回true
。例如,isNaN('hello')
返回true
,因为 'hello' 转换为数字是NaN
。 -
Number.isNaN(value)
: 不会进行类型转换,只判断value
是否严格等于NaN
。 这是更推荐的做法,因为它避免了isNaN()
的隐式类型转换带来的潜在问题。 例如,Number.isNaN('hello')
返回false
,因为 'hello' 不是NaN
,而isNaN('hello')
返回true
。
示例:
console.log(NaN === NaN); // Output: false
console.log(isNaN(NaN)); // Output: true
console.log(Number.isNaN(NaN)); // Output: true
console.log(isNaN('hello')); // Output: true
console.log(Number.isNaN('hello')); // Output: false
let result = 0 / 0;
console.log(result === NaN); // Output: false
console.log(isNaN(result)); // Output: true
console.log(Number.isNaN(result)); // Output: true
总而言之,要判断一个值是否为 NaN
,请使用 Number.isNaN()
。 不要使用 value === NaN
。