isNaN(1)和isNaN("1")返回false

Om3*_*3ga -1 javascript

为什么在我的截图下面isNaN(1)isNaN("1")返回false?由于其中一个是数字,其中一个是字符串,所以isNaN("1")应该返回true.

在此输入图像描述

p.s*_*w.g 7

来自MDN:

isNaN函数的参数不是Number类型时,该值首先被强制转换为Number.然后测试得到的值以确定它是否是NaN.因此,对于非数字,当强制转换为数字类型时会产生有效的非NaN数值(特别是空字符串和布尔基元,当强制赋予数值0或1时),"false"返回值可能是意外的; 例如,空字符串肯定是"不是数字".

如果您不想要这种行为,文章还建议使用(体验)Number.isNaN功能:

console.log(Number.isNaN("1")) // false
console.log(Number.isNaN(NaN)) // true
Run Code Online (Sandbox Code Playgroud)

或者更简单:

console.log("1" != "1") // false
console.log(NaN != NaN) // true
Run Code Online (Sandbox Code Playgroud)

但是,如果您真正想要简单地确定类型的值Number(而不是类型String),只需使用typeof:

console.log(typeof "1" == "number") // false
console.log(typeof 1 == "number")   // true
Run Code Online (Sandbox Code Playgroud)

但这将会回归true,NaN因为尽管被称为"非数字",但它实际上是一种类型的价值Number.如果要确保值是类型Number,并且有效的有限数字使用(实验)Number.isFinite:

console.log(Number.isFinite("1")) // false
console.log(Number.isFinite(1))   // true
console.log(Number.isFinite(NaN)) // false
Run Code Online (Sandbox Code Playgroud)

或者只是创建自己的:

function myIsFinite(x) { return typeof x == "number" && isFinite(x); }
console.log(myIsFinite("1")) // false
console.log(myIsFinite(1))   // true
console.log(myIsFinite(NaN)) // false
Run Code Online (Sandbox Code Playgroud)