这个说false
,意思是""
是一个数字:
alert(isNaN(""));
这个说NaN
,意思""
是 不是数字,不能转换:
alert(parseFloat(""));
我期待第二个代码转换""
为,0
因为""
在测试时是一个数字,IsNaN
但我错了!我是疯了还是我错过了什么?
这个说false
,意思是""
是一个数字:
alert(isNaN(""));
这个说NaN
,意思""
是 不是数字,不能转换:
alert(parseFloat(""));
我期待第二个代码转换""
为,0
因为""
在测试时是一个数字,IsNaN
但我错了!我是疯了还是我错过了什么?
parseFloat
尝试从字符串中解析一个数字,其中 as在检查isNaN
参数之前将其转换为数字:
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;
}
isNaN
转换为 Number 类型并检查该值是否为特殊数字 NaN。
转换为数字的空字符串是0
( +"" === 0
),因为0
你NaN
看不到false
。
然而parseFloat比简单地转换为数字类型更复杂,它返回NaN
空字符串 ( parseFloat("") === NaN
)。
不是NaN
不等于是一个数字。这只是意味着你不是很特别的价值NaN
。
或者任何可以NaN
通过 JS 语言的神秘转换规则转换的东西。
Javascript 将空字符串解释为 0 失败 isNaN 测试。至于 parseFloat 尝试解析失败并返回 NaN 的空字符串中的数字。
要理解这种行为,理解语义很重要。
isNaN
检查 value 是否不能强制为数字,如果在 value 上调用它返回 false,则表示Number(value)
将返回有效数字。
parseFloat
从字符串中解析数字,如果字符串不以任何数字开头,则返回NaN
,因为没有找到要解析的数字。
程序员倾向于过度使用parseInt
和parseFloat
强制,而在大多数情况下他们应该使用Number
,这更严格并且没有那么混乱。