在 JavaScript 中,NaN(Not-a-Number)代表一个特殊的非数字值。当你需要检查一个值是否为 NaN 时,通常会使用 isNaN() 函数。然而,在 ECMAScript 6(ES6)之后,引入了 Number.isNaN() 方法,用于更精确地判断一个值是否为 NaN。尽管这两者都涉及到 NaN,但它们之间存在一些关键的区别。在本文中,我们将深入探讨 Number.isNaN 和 isNaN 的不同之处。
NaN + 5; // 返回 NaN NaN - 2; // 返回 NaN NaN * 10; // 返回 NaNNaN 与任何值都不相等,包括它自己: 即使是另一个 NaN 值,与 NaN 进行比较也会返回 false。
NaN === NaN; // 返回 false NaN == NaN; // 返回 false
为了检查一个值是否为 NaN,应该使用 Number.isNaN(),而不是相等运算符。
isNaN(value)isNaN 函数返回一个布尔值,如果传入的值是 NaN,则返回 true;如果不是 NaN,则返回 false。
但是,isNaN 存在一些问题,导致其在某些情况下的行为不符合预期。这些问题主要涉及到它的类型转换规则。
isNaN("hello"); // 返回 true,但 "hello" 不是 NaN isNaN(undefined); // 返回 true,但 undefined 不是 NaN isNaN({}); // 返回 true,但空对象 {} 不是 NaN这是因为 isNaN 会尝试将这些值转换为数字,而这些转换都会返回 NaN。因此,isNaN 在这些情况下不准确。
为了解决这个问题,ECMAScript 6 引入了 Number.isNaN 方法。
Number.isNaN(value)
Number.isNaN 方法返回一个布尔值,如果传入的值是 NaN,则返回 true;如果不是 NaN,则返回 false。与 isNaN 不同,Number.isNaN 不会尝试将传入的值转换为数字,它只会严格检查是否为 NaN。
Number.isNaN("hello"); // 返回 false,"hello" 不是 NaN Number.isNaN(undefined); // 返回 false,undefined 不是 NaN Number.isNaN({}); // 返回 false,空对象 {} 不是 NaN
因此,Number.isNaN 解决了 isNaN 的问题,使我们能够更可靠地检查一个值是否为 NaN。
if (!Number.isNaN) { Number.isNaN = function(value) { return typeof value === "number" && isNaN(value); }; }
这个 polyfill 将添加缺失的 Number.isNaN 方法,使其在不支持 ES6 的环境中也可以使用。当讨论 NaN(Not-a-Number)时,除了了解如何检查它以外,还应该了解一些关于 NaN 的特点。NaN 在 JavaScript 中有一些独特的行为,这些特点在编程中可能会产生一些令人惊讶的结果。