【发布时间】:2012-05-11 17:29:34
【问题描述】:
可能重复:
Conflicting boolean values of an empty JavaScript array
这个事实背后的原因是什么
[ ([] == false), ([] ? 1 : 2) ]
返回[true, 1]?
换句话说,一个空列表在布尔上下文中逻辑上为真,但等于false。
我知道使用=== 可以解决问题,但这个明显完全不合逻辑的选择背后的解释是什么?
换句话说,这是否被认为是语言中的错误,只是无意中发生的事情,无法修复,因为为时已晚,或者真的在语言设计中,有人认为这种明显的疯狂很酷我确定这让很多程序员感到很困惑?
关于这种情况如何发生的技术解释既令人惊讶又令人恐惧,但我对这种设计背后的内容更感兴趣。
编辑
我接受了非常详细的 Nick Retallack 解释,即使它只是关于为什么 []==false 为真的技术原因:令人惊讶的是,它发生的原因是 [] 转换为字符串是一个空字符串,而空字符串数值是特殊情况下为 0 而不是显然更合乎逻辑的NaN。以空对象为例,比较 ({}) == false 返回 false,因为空对象的字符串表示不是空字符串。
我的好奇心仍然存在,这一切只是出乎意料(不幸的是现在固化在一个标准中)。
【问题讨论】:
-
这很有趣! [].toString() 可能有问题?
-
![] == false也返回true。 :-) -
@ElliotBonneville 另一个有趣的事情:
![].toString() == false返回false。
标签: javascript language-design