使用 isNaN() 测试 NaN
window.isNaN()
全局函数 isNaN() 可用于检查某个值或表达式是否计算为 NaN。此函数(简而言之)首先检查值是否为数字,如果没有尝试转换它(*),然后检查结果值是否为 NaN。因此,这种测试方法可能会引起混淆。
(*)转换方法并不那么简单,有关算法的详细说明,请参阅 ECMA-262 18.2.3 。
这些示例将帮助你更好地理解 isNaN() 行为:
isNaN(NaN); // true
isNaN(1); // false: 1 is a number
isNaN(-2e-4); // false: -2e-4 is a number (-0.0002) in scientific notation
isNaN(Infinity); // false: Infinity is a number
isNaN(true); // false: converted to 1, which is a number
isNaN(false); // false: converted to 0, which is a number
isNaN(null); // false: converted to 0, which is a number
isNaN(""); // false: converted to 0, which is a number
isNaN(" "); // false: converted to 0, which is a number
isNaN("45.3"); // false: string representing a number, converted to 45.3
isNaN("1.2e3"); // false: string representing a number, converted to 1.2e3
isNaN("Infinity"); // false: string representing a number, converted to Infinity
isNaN(new Date); // false: Date object, converted to milliseconds since epoch
isNaN("10$"); // true : conversion fails, the dollar sign is not a digit
isNaN("hello"); // true : conversion fails, no digits at all
isNaN(undefined); // true : converted to NaN
isNaN(); // true : converted to NaN (implicitly undefined)
isNaN(function(){}); // true : conversion fails
isNaN({}); // true : conversion fails
isNaN([1, 2]); // true : converted to "1, 2", which can't be converted to a number
最后一个有点棘手:检查 Array 是否是 NaN。为此,Number() 构造函数首先将数组转换为字符串,然后转换为数字; 这就是 isNaN([]) 和 isNaN([34]) 都返回 false 的原因,但是 isNaN([1, 2]) 和 isNaN([true]) 都返回了 true:因为它们分别被转换为 "",34,1,2 和 true。通常, isNaN() 将数组视为 NaN,除非它只保存一个元素,其字符串表示可以转换为有效数字。
Version >= 6
Number.isNaN()
在 ECMAScript 6 中,Number.isNaN() 函数的实现主要是为了避免强制将参数转换为数字的问题。实际上,Number.isNaN() 在测试之前不会尝试将值转换为数字。这也意味着只有数字类型的值,也就是 NaN,返回 true (这基本上只意味着 Number.isNaN(NaN))。
来自 ECMA-262 20.1.2.4 :
当用一个参数
number调用Number.isNaN时,采取以下步骤:
- 如果
Type(number)不是 Number,则返回false。- 如果数字是
NaN,请返回true。- 否则,返回
false。
一些例子:
// The one and only
Number.isNaN(NaN); // true
// Numbers
Number.isNaN(1); // false
Number.isNaN(-2e-4); // false
Number.isNaN(Infinity); // false
// Values not of type number
Number.isNaN(true); // false
Number.isNaN(false); // false
Number.isNaN(null); // false
Number.isNaN(""); // false
Number.isNaN(" "); // false
Number.isNaN("45.3"); // false
Number.isNaN("1.2e3"); // false
Number.isNaN("Infinity"); // false
Number.isNaN(new Date); // false
Number.isNaN("10$"); // false
Number.isNaN("hello"); // false
Number.isNaN(undefined); // false
Number.isNaN(); // false
Number.isNaN(function(){}); // false
Number.isNaN({}); // false
Number.isNaN([]); // false
Number.isNaN([1]); // false
Number.isNaN([1, 2]); // false
Number.isNaN([true]); // false