isNaN()

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

isNaN() 函数用于判断一个值是否为 NaN,如有必要,会首先将该值转换为数字。由于 isNaN() 函数内部的类型强制转换可能出乎意料,因此您可能更倾向于使用 Number.isNaN()

试一试

function milliseconds(x) {
  if (isNaN(x)) {
    return "Not a Number!";
  }
  return x * 1000;
}

console.log(milliseconds("100F"));
// Expected output: "Not a Number!"

console.log(milliseconds("0.0314E+2"));
// Expected output: 3140

语法

js
isNaN(value)

参数

value

要测试的值。

返回值

如果给定值在转换为数字后是 NaN,则返回 true;否则返回 false

描述

isNaN() 是全局对象的一个函数属性。

对于数字值,isNaN() 测试该数字是否为 NaN。当 isNaN() 函数的参数不是 Number 类型时,该值会首先被强制转换为数字,然后将结果值与 NaN 进行比较。

isNaN() 对于非数字参数的这种行为可能会让人感到困惑!例如,空字符串被强制转换为 0,而布尔值被强制转换为 0 或 1;从直观上来说,这两个值都“不是数字”,但它们不会被评估为 NaN,因此 isNaN() 返回 false。因此,isNaN() 既不能回答“输入是否为浮点数 NaN 值”的问题,也不能回答“输入是否不是数字”的问题。

Number.isNaN() 是一种更可靠的方法来测试一个值是否为数字值 NaN。或者,可以使用表达式 x !== x,这两种解决方案都不会受到全局 isNaN() 不可靠的假阳性的影响。要测试一个值是否为数字,请使用 typeof x === "number"

isNaN() 函数回答的问题是“在数字上下文中,输入是否功能上等同于 NaN”。如果 isNaN(x) 返回 false,则您可以在算术表达式中使用 x,就像它是一个有效的非 NaN 数字一样。如果 isNaN(x) 返回 true,则 x 将被强制转换为 NaN 并使大多数算术表达式返回 NaN(因为 NaN 会传播)。您可以利用这一点,例如,测试函数参数是否可进行算术处理(可“像”数字一样使用),并通过抛出错误、提供默认值等方式处理非数字值。通过这种方式,您可以编写一个函数,充分利用 JavaScript 根据上下文隐式转换值所提供的全部灵活性。

注意:+ 运算符既执行数字加法也执行字符串连接。因此,即使 isNaN() 对两个操作数都返回 false+ 运算符仍可能返回一个字符串,因为它不是用作算术运算符。例如,isNaN("1") 返回 false,但 "1" + 1 返回 "11"。为了确保您正在使用数字,请将该值强制转换为数字,并使用 Number.isNaN() 来测试结果。

示例

请注意 isNaN() 如何对那些不是 NaN 值但也不是数字的值返回 true

js
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true

isNaN(true); // false
isNaN(null); // false
isNaN(37); // false

// Strings
isNaN("37"); // false: "37" is converted to the number 37 which is not NaN
isNaN("37.37"); // false: "37.37" is converted to the number 37.37 which is not NaN
isNaN("37,5"); // true
isNaN("123ABC"); // true: Number("123ABC") is NaN
isNaN(""); // false: the empty string is converted to 0 which is not NaN
isNaN(" "); // false: a string with spaces is converted to 0 which is not NaN

// Dates
isNaN(new Date()); // false; Date objects can be converted to a number (timestamp)
isNaN(new Date().toString()); // true; the string representation of a Date object cannot be parsed as a number

// Arrays
isNaN([]); // false; the primitive representation is "", which coverts to the number 0
isNaN([1]); // false; the primitive representation is "1"
isNaN([1, 2]); // true; the primitive representation is "1,2", which cannot be parsed as number

规范

规范
ECMAScript® 2026 语言规范
# sec-isnan-number

浏览器兼容性

另见