【问题标题】:Why is the result of Number.isNaN('abc') false?为什么 Number.isNaN('abc') 的结果为假?
【发布时间】:2020-11-10 20:02:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 因为'abc' 的类型不是数字。 "isNaN 尝试将值解析为数字" - 不,它没有。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。你可能会想到全球版developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 是的,在这种情况下,isNAN 不应该是真而不是假吗? isNAN 代表 is Not a Number 对吗?
  • "我知道 isNaN 试图将值解析为数字," - 你是对的,全局 isNaN 函数就是这样做的。但是,您正在调用 Number.isNaN,这是一个具有不同操作的不同函数。它会逐字检查您给它的值是否 NaN,而不是它是否转换NaN
  • 不,字符串不是Number,但也不是数值NaN
  • @Link 它代表“不是数字”。不适用于碰巧不是数字的 任何 值。

标签: javascript undefined-behavior


【解决方案1】:

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

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

specificationNumber.isNaN 定义为:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2016-05-07
    • 2017-07-25
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多