为什么在JavaScript中,0 == ""的结果是true?

35
为什么在JavaScript中0 == ""是true?我找到了类似的帖子,但为什么数字0与空字符串相似呢?当然,0 === ""是false。

对于 PHP,请参见 http://php.net/manual/en/types.comparisons.php - apscience
我认为这是因为Javascript在某些情况下自动强制转换字符串和数字,==运算符就是其中之一,而""被强制转换为0。 - millimoose
2
@HorstWalter 不是的。字符串被强制转换为数字类型。请看我的回答。 - Šime Vidas
@Ӫ_._Ӫ 那是我的第一反应。:) - Šime Vidas
1
@Ӫ_._Ӫ 是的,我曾经认为两个假值之间的==比较总是会评估为真。但是后来我想起了NaN != NaN...整个想法就崩溃了,哈哈。 - Šime Vidas
显示剩余4条评论
1个回答

74
0 == ''

左操作数的类型为数字(Number)。
右操作数的类型为字符串(String)。

在此情况下,右操作数会被强制转换为数字类型:

0 == Number('')

这导致

0 == 0

抽象相等比较算法(编号为4)中得到以下内容:

如果 x 的类型为数字且 y 的类型为字符串,则返回比较结果 x == ToNumber(y)。

来源:http://es5.github.com/#x11.9.3


谢谢,我只是期望它以另一种方式进行转换,即将0转换为字符串,然后为false。 - Horst Walter
是的,另一方面,这意味着说两者都是falsy - 就像其他答案中所说的那样,不完全正确。因为 - 正如您非常清楚地表明的那样 - 原因是 "" => 0。感谢您的支持! - Horst Walter
1
@Horst - 是的,没错。如果你在 if (0) 或者 if("") 中单独使用它们,两个都是假值,但是在 == 比较中情况就不同了。(不确定为什么Šime也在上面留下了一条评论说“因为两个值都是假值”。) - nnnnnn
3
哦,我不知道 es5.github.com。比在 PDF 中输入页码要方便得多。 - millimoose
@nnnnnn 这是我的第一反应,结果证明它是不正确的。 - Šime Vidas
有时候我讨厌Javascript的转换系统。在像R这样的语言中,0会被转换为字符"0",结果如预期的那样是false。将0转换为"0"确实有一定的逻辑,但将""转换为0根本没有任何逻辑... - Adrian

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