在 JavaScript 中,为什么isNaN(" ")
计算为false
,但isNaN(" x")
计算为true
?
我在一个文本输入字段进行数字运算,和我正在检查该字段为null
,""
或NaN
。当有人在字段中输入少量空格时,我的验证对所有三个都失败了,我很困惑为什么它通过了isNaN
检查。
在 JavaScript 中,为什么isNaN(" ")
计算为false
,但isNaN(" x")
计算为true
?
我在一个文本输入字段进行数字运算,和我正在检查该字段为null
,""
或NaN
。当有人在字段中输入少量空格时,我的验证对所有三个都失败了,我很困惑为什么它通过了isNaN
检查。
JavaScript 将空字符串解释为 0,然后通过 isNAN 测试失败。您可以先在字符串上使用 parseInt,它不会将空字符串转换为 0。结果应该会失败 isNAN。
您可能会觉得这令人惊讶,也可能不会,但这里有一些测试代码向您展示 JavaScript 引擎的古怪之处。
document.write(isNaN("")) // false
document.write(isNaN(" ")) // false
document.write(isNaN(0)) // false
document.write(isNaN(null)) // false
document.write(isNaN(false)) // false
document.write("" == false) // true
document.write("" == 0) // true
document.write(" " == 0) // true
document.write(" " == false) // true
document.write(0 == false) // true
document.write(" " == "") // false
所以这意味着
" " == 0 == false
和
"" == 0 == false
但
"" != " "
玩得开心 :)
为了更好地理解它,请打开第 43 页“ToNumber 应用于字符串类型”上的Ecma-Script 规范 pdf
如果字符串具有数字语法,可以包含任意数量的空白字符,则可以将其转换为数字类型。空字符串的计算结果为 0。字符串 'Infinity' 也应该给出
isNaN('Infinity'); // false
尝试使用:
alert(isNaN(parseInt(" ")));
或者
alert(isNaN(parseFloat(" ")));
从MDN
您面临的问题的原因
当 isNaN 函数的参数不是 Number 类型时,该值首先被强制转换为 Number。然后测试结果值以确定它是否为 NaN。
您可能需要查看以下综合答案,其中也涵盖了 NaN 比较的相等性。