这个说false
,意味着""
是一个数字:
alert(isNaN(""));
这个说NaN
,意味着""
不是数字且无法转换:
alert(parseFloat(""));
我期待第二个代码将""
转换为0
,因为在""
中测试时IsNaN
是一个数字,但我错了!我疯了还是我错过了什么?
答案 0 :(得分:3)
parseFloat
尝试解析字符串中的数字isNaN
converts the argument to number:
Number("") //0 http://ecma-international.org/ecma-262/5.1/#sec-9.3.1
parseFloat("") //NaN http://ecma-international.org/ecma-262/5.1/#sec-15.1.2.3
显然这是“破碎”或“混乱”,所以从规格:
ECMAScript代码测试值X是NaN的可靠方法是 X!== X形式的表达式。当且仅当如果,结果将为真 X是NaN。
0 !== 0 // false
NaN !== NaN //true
function isExactlyNaN(x) {
return x !== x;
}
答案 1 :(得分:1)
isNaN
转换为Number类型并检查该值是否为特殊数字NaN。
转换为数字的空字符串为0
(+"" === 0
),由于0
不是NaN
,您会看到false
。
parseFloat比简单转换为数字类型更复杂,它会为空字符串(NaN
)返回parseFloat("") === NaN
。
答案 2 :(得分:1)
不是NaN
与数字不同。这只是意味着你不是非常特殊的值NaN
。
或任何可通过JS语言的神秘转换规则转换为NaN
的内容。
答案 3 :(得分:0)
Javascript将空字符串解释为0,无法通过isNaN测试。至于parseFloat尝试解析失败的空字符串中的数字并返回NaN ..
答案 4 :(得分:0)
要理解这种行为,理解语义很重要。
isNaN
检查值是否强制为数字,如果在值上调用它返回false,则表示Number(value)
将返回有效数字。
parseFloat
从字符串中解析数字,如果字符串不以任何数字开头,则返回NaN
,因为找不到要解析的数字。
程序员倾向于过度使用parseInt
和parseFloat
进行强制攻击,而在大多数情况下,他们应该使用Number
,这更严格而且不会让人感到困惑。