为什么我的屏幕截图isNaN(1)
和isNaN("1")
会返回false
?因为其中一个是数字,其中一个是字符串,所以isNaN(“1”)应该返回true。
答案 0 :(得分:7)
来自MDN:
当
isNaN
函数的参数不是Number类型时,该值首先被强制转换为数字。然后测试得到的值以确定它是否是NaN。因此,对于非数字,当强制转换为数字类型时会产生有效的非NaN数值(特别是空字符串和布尔基元,当强制赋予数值0或1时),“false”返回值可能是意外的;例如,空字符串肯定是“不是数字。”
如果您不想要此行为,本文还建议使用(经验)Number.isNaN
函数:
console.log(Number.isNaN("1")) // false
console.log(Number.isNaN(NaN)) // true
或更简单:
console.log("1" != "1") // false
console.log(NaN != NaN) // true
但是,如果你真的想要简单地确定类型Number
的值(而不是String
类型的值),只需使用typeof
:
console.log(typeof "1" == "number") // false
console.log(typeof 1 == "number") // true
但是这会为true
返回NaN
,因为尽管被称为“非数字”,但它实际上是Number
类型的值。如果您想确保值为Number
类型,并且有效的有限数字使用( experimental )Number.isFinite
:
console.log(Number.isFinite("1")) // false
console.log(Number.isFinite(1)) // true
console.log(Number.isFinite(NaN)) // false
或者只是创建自己的:
function myIsFinite(x) { return typeof x == "number" && isFinite(x); }
console.log(myIsFinite("1")) // false
console.log(myIsFinite(1)) // true
console.log(myIsFinite(NaN)) // false
答案 1 :(得分:0)
isNaN
函数会先将输入转换为数字,然后确定结果数是否为NaN。