在Javascript中:
NaN === NaN; // false
我试图确定isNaN(foo)
何时不等于+foo
“是”NaN
。但是我不知道如何判断某些内容是NaN
,除非使用isNaN
,其中许多内容都是肯定的,其中没有===
NaN。
所以我认为正确的方法是解决其他可能性:
typeof NaN === 'number' // true
因此我认为
typeof(foo) === 'number' && isNaN(foo)
最接近我的想法。这是有道理的,因为NaN
是唯一不是数字或其他内容的数字是有意义的。这是正确的,这是最好的方法吗?
答案 0 :(得分:7)
使用它对您有利:
foo !== foo
这相当于typeof foo === 'number' && isNaN(foo)
和is what Underscore.js uses to check for exactly NaN
, too。
答案 1 :(得分:3)
NaN不等于自身的原因是两个计算可能因为不同的原因而变成NaN。如果你进行两次计算并比较结果,如果其中一个值是NaN,或者两者都是NaN,则不希望它们相等。
只要您只在数值上使用它,isNaN
方法就可以正常工作。它为很多其他类型提供了不直观的结果,所以你不应该在数字以外的任何其他地方使用它。
答案 2 :(得分:0)
如果您可以使用ECMAScript 6,则可以使用Object.is
:
return Object.is(foo, NaN);
Object.is()
确定两个值是否相同。如果下列之一成立,则两个值相同:
[...]
NaN
MDN还建议Polyfill如果未定义Object.is
(使用相同的foo!==foo
技巧):
if (!Object.is) {
Object.is = function(x, y) {
// SameValue algorithm
if (x === y) { // Steps 1-5, 7-10
// Steps 6.b-6.e: +0 != -0
return x !== 0 || 1 / x === 1 / y;
} else {
// Step 6.a: NaN == NaN
return x !== x && y !== y;
}
};
}