为什么 Number.isNaN('abc') 的结果是假的?

Lin*_*ink 2 javascript undefined-behavior

我查看了 MDN 文档和其他 Stack Overflow 问题,但是无法找到这个问题的确切原因。我知道 isNaN 试图将值解析为数字,但是当我尝试在 'abc' 上运行 Number.parseInt 或 Number.parseFloat 时,它给了我 'NaN' 但是当我实际运行 isNaN 函数时,它给了我 'false'。

我知道有更好的方法来检查某个东西是否是数字,例如 Number.isFinite(),但在这种情况下,我试图了解 isNaN 是如何工作的。

console.log(Number.parseInt('abc'));
console.log(Number.parseFloat('abc'));

console.log(Number.isNaN('abc'));
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 6

NaN是一个特殊的数字值。Number.isNaN验证传入的值是否等于NaN,因为“正常”比较不起作用(NaN == NaNfalse根据定义)。

不像一些其他的方法,Number.isNaN没有进行类型转换。'abc'是一个字符串值,因此它不能是NaN.

规范定义Number.isNaN为:

  1. 如果 Type( number ) 不是 Number,则返回false
  2. 如果numberNaN,则返回true
  3. 否则,返回false

请注意,还有 globalisNaN函数,它的行为有所不同:如果您给它一个不是数字类型的值,它会在进行检查之前将其转换为数字类型。所以isNaN('abc')true因为如果您'abc'使用默认的字符串到数字转换转换为数字,则会得到NaN; 但Number.isNaN('abc')就是false因为它不会做这种转换。