isNaN()

isNaN() 函数用来确定一个值是否为 NaN,若有必要,则首先将值转换为数字。由于 isNaN() 函数内部的强制类型转换可能令人迷惑,因此你可能更想要使用 Number.isNaN()

尝试一下

语法

js
isNaN(value)

参数

value

要被检测的值。

返回值

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

描述

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

对于数字值,isNaN() 检测该值是否为 NaN 值。当 isNaN() 函数的参数不是数字类型时,其会首先被转换为数字,然后将其结果值与 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

// 字符串
isNaN("37"); // false:可以被转换成数字 37,不是 NaN
isNaN("37.37"); // false:可以被转换成数字 37.37,不是 NaN
isNaN("37,5"); // true
isNaN("123ABC"); // true:Number("123ABC") 的结果是 NaN
isNaN(""); // false:空字符串被转换成 0,不是 NaN
isNaN(" "); // false:由空格组成的字符串被转换成 0,不是 NaN

// 日期
isNaN(new Date()); // false;Date 对象可以转换为数字(时间戳)
isNaN(new Date().toString()); // true;Date 对象的字符串表示形式不能解析为数字

规范

Specification
ECMAScript Language Specification
# sec-isnan-number

浏览器兼容性

BCD tables only load in the browser

参见