为什么 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
为:
- If Type(number) is not Number, return
false
.
- If number is
NaN
, return true
.
- Otherwise, return
false
.
请注意,还有全局 isNaN
函数,其行为不同:如果您给它一个不是数字类型的值,它会在进行检查之前将其转换为数字类型。所以 isNaN('abc')
是 true
因为如果您使用默认的字符串到数字转换将 'abc'
转换为数字,您会得到 NaN
;但是 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
为:
- If Type(number) is not Number, return
false
.- If number is
NaN
, returntrue
.- Otherwise, return
false
.
请注意,还有全局 isNaN
函数,其行为不同:如果您给它一个不是数字类型的值,它会在进行检查之前将其转换为数字类型。所以 isNaN('abc')
是 true
因为如果您使用默认的字符串到数字转换将 'abc'
转换为数字,您会得到 NaN
;但是 Number.isNaN('abc')
是 false
因为它不进行该转换。