false
,意味着""
是一个数字:alert(isNaN(""));
这里显示 NaN
,意思是 ""
不是数字,无法转换:
alert(parseFloat(""));
我原以为第二段代码会将 ""
转换成 0
,因为在 IsNaN
的测试中,""
是一个数字,但是我错了!我是疯了还是漏掉了什么?
false
,意味着""
是一个数字:alert(isNaN(""));
这里显示 NaN
,意思是 ""
不是数字,无法转换:
alert(parseFloat(""));
我原以为第二段代码会将 ""
转换成 0
,因为在 IsNaN
的测试中,""
是一个数字,但是我错了!我是疯了还是漏掉了什么?
parseFloat
试图从字符串解析出一个数字,而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时,结果将为true。
0 !== 0 // false
NaN !== NaN //true
function isExactlyNaN(x) {
return x !== x;
}
isNaN("NaN")
返回 true
。 - leppieisNaN("pepperoni")
也是 :) - PaulisNaN
将值转换为数字类型并检查其是否为特殊数字 NaN。
空字符串转换为数字是 0
(+"" === 0
),由于 0
不是 NaN
,因此结果为 false
。
parseFloat 比简单的转换为数字类型更复杂,对于空字符串它返回 NaN
(parseFloat("") === NaN
)。
不是 NaN
并不意味着它是一个数字。它只是意味着你不是非常特殊的值 NaN
。
或者任何按照 JS 语言的奥秘转换规则可以转换为 NaN
的东西。
NaN
也是一个数字:typeof NaN === "number"
- PaulNaN
是一个特殊的数值。也许更好地将其视为“代表像 0/0 或 Infinity/Infinity 这样的操作结果的‘数字’”。 - DomenicJavascript 将空字符串解释为 0,这会导致 isNaN 测试失败。而 parseFloat 尝试解析空字符串中的数字,但由于其中没有数字,所以会返回 NaN。
要理解这个行为,了解语义是很重要的。
isNaN
检查值是否无法被强制转换为数字,如果在值上调用它返回 false,则意味着 Number(value)
将返回有效数字。
parseFloat
从字符串中解析数字,如果字符串不以任何数字开头,则返回 NaN
,因为没有找到要解析的数字。
程序员倾向于过度使用 parseInt
和 parseFloat
进行强制转换,在大多数情况下,他们应该使用更严格且不那么混淆的 Number
。