全局对象的 NaN 属性
NaN
(“ N ot a N umber”)是由 IEEE 浮点运算标准 定义的特殊值,当提供非数字值但预期数字(1 * "two"
)时,或者当计算没有时使用没有有效的 number
结果(Math.sqrt(-1)
)。
与 NaN
的任何相等或相关比较都会返回 false
,甚至将其与自身进行比较。因为,NaN
应该表示无意义计算的结果,因此,它不等于任何其他无意义计算的结果。
(1 * "two") === NaN //false
NaN === 0; // false
NaN === NaN; // false
Number.NaN === NaN; // false
NaN < 0; // false
NaN > 0; // false
NaN > 0; // false
NaN >= NaN; // false
NaN >= 'two'; // false
非相等比较将始终返回 true
:
NaN !== 0; // true
NaN !== NaN; // true
检查值是否为 NaN
Version >= 6
你可以使用函数 Number.isNaN()
测试 NaN
的值或表达式 :
Number.isNaN(NaN); // true
Number.isNaN(0 / 0); // true
Number.isNaN('str' - 12); // true
Number.isNaN(24); // false
Number.isNaN('24'); // false
Number.isNaN(1 / 0); // false
Number.isNaN(Infinity); // false
Number.isNaN('str'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Version < 6
你可以通过与自身进行比较来检查值是否为 NaN
:
value !== value; // true for NaN, false for any other value
你可以将以下 polyfill 用于 Number.isNaN()
:
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
相比之下,全局函数 isNaN()
不仅为 NaN
返回 true
,而且还为任何不能强制转换为数字的值或表达式返回 true
:
isNaN(NaN); // true
isNaN(0 / 0); // true
isNaN('str' - 12); // true
isNaN(24); // false
isNaN('24'); // false
isNaN(Infinity); // false
isNaN('str'); // true
isNaN(undefined); // true
isNaN({}); // true
ECMAScript 定义了一个名为 SameValue
的相同算法,因为 ECMAScript 6 可以用 Object.is
调用。与 ==
和 ===
的比较不同,使用 Object.is()
会将 NaN
视为与自身相同(而 -0
与+0
不同):
Object.is(NaN, NaN) // true
Object.is(+0, 0) // false
NaN === NaN // false
+0 === 0 // true
Version < 6
你可以将以下 polyfill 用于 Object.is()
(来自 MDN ):
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;
}
};
}
注意事项
NaN 本身是一个数字,意味着它不等于字符串 NaN
,最重要的是(虽然可能不直观):
typeof(NaN) === "number"; //true