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

Why is the result of Number.isNaN('abc') false?

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

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

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

console.log(Number.isNaN('abc'));

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

与其他一些方法不同,Number.isNaN 执行类型转换。 'abc' 是一个 字符串 值,因此它不能是 NaN.

specification定义Number.isNaN为:

  1. If Type(number) is not Number, return false.
  2. If number is NaN, return true.
  3. Otherwise, return false.

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