JavaScript中的""到底是什么?

5
这里显示为false,意味着""是一个数字:
alert(isNaN("")); 

这里显示 NaN,意思是 "" 不是数字,无法转换:

alert(parseFloat(""));

我原以为第二段代码会将 "" 转换成 0 ,因为在 IsNaN 的测试中,"" 是一个数字,但是我错了!我是疯了还是漏掉了什么?


6
"" 是一个字符串。 - Ismail Badawi
嗯,那很有趣。""只是一个空字符串而已。基本上,你刚刚证明了isNaaN不使用与parseFloat相同的代码。 - Matt Dodge
@isbadawi 谢谢,我编辑了我的问题,这样你就能理解我真正想要实现什么了。 - kazinix
1
https://dev59.com/MXRA5IYBdhLWcg3wyRJ7 - Ayush
2
MDN的isNaN页面以一个警告开始:“小心,这个函数是有问题的。”它继续解释了为什么(并明确提到了空字符串)。 - nnnnnn
我想知道为什么Mozilla使用IEEE 794而不是IEEE 754...(前者是否真的存在?) - leppie
5个回答

4

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 - leppie
2
@leppie 所以 isNaN("pepperoni") 也是 :) - Paul
@PaulP.R.O.:肯定是IEEE 794;p - leppie

1

isNaN 将值转换为数字类型并检查其是否为特殊数字 NaN。

空字符串转换为数字是 0 (+"" === 0),由于 0 不是 NaN,因此结果为 false

parseFloat 比简单的转换为数字类型更复杂,对于空字符串它返回 NaN (parseFloat("") === NaN)。


1

不是 NaN 并不意味着它是一个数字。它只是意味着你不是非常特殊的值 NaN

或者任何按照 JS 语言的奥秘转换规则可以转换为 NaN 的东西。


“NaN” 再次是什么意思?不是数字吗?去掉“不是”就变成了数字:D 至少在我的理解中。 - kazinix
1
@dpp NaN 也是一个数字:typeof NaN === "number" - Paul
NaN 是一个特殊的数值。也许更好地将其视为“代表像 0/0 或 Infinity/Infinity 这样的操作结果的‘数字’”。 - Domenic

0

Javascript 将空字符串解释为 0,这会导致 isNaN 测试失败。而 parseFloat 尝试解析空字符串中的数字,但由于其中没有数字,所以会返回 NaN。


是 JavaScript 将其解释为 0 还是 isNaN 函数?因为如果是 JavaScript,那么为什么 parseFloat 不将 "" 视为 0 呢? - kazinix

0

要理解这个行为,了解语义是很重要的。

isNaN 检查值是否无法被强制转换为数字,如果在值上调用它返回 false,则意味着 Number(value) 将返回有效数字。

parseFloat 从字符串中解析数字,如果字符串不以任何数字开头,则返回 NaN,因为没有找到要解析的数字。

程序员倾向于过度使用 parseIntparseFloat 进行强制转换,在大多数情况下,他们应该使用更严格且不那么混淆的 Number


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接