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

来自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)