我最近2 == [2]在JavaScript中发现了这一点。事实证明,这个怪癖有一些有趣的后果:
var a = [0, 1, 2, 3]; a[[2]] === a[2]; // this is true 同样,以下工作:
var a = { "abc" : 1 }; a[["abc"]] === a["abc"]; // this is also true 甚至还是陌生人,这同样有效:
[[[[[[[2]]]]]]] == 2; // this is true too! WTF? 这些行为在所有浏览器中似乎都是一致的。
知道为什么这是语言功能吗?
这是此“功能”的更疯狂的后果:
[0] == false // true if ([0]) { /* executes */ } // [0] is both true and false!
var a = [0]; a == a // true a == !a // also true, WTF? 这些示例由jimbojw http://jimbojw.com的名望以及walkingeyerobot发现。
您可以在ECMA规范中查找比较算法(有关问题的ECMA-262,第三版的相关部分:11.9.3、9.1、8.6.2.6)。
如果将涉及的抽象算法转换回JS,则评估时2 == [2]基本上会发生以下情况:
2 === Number([2].valueOf().toString()) 其中valueOf(),数组返回数组本身,一元素数组的字符串表示形式是单个元素的字符串表示形式。
这也解释了第三个示例,因为[[[[[[[2]]]]]]].toString()它仍然只是字符串2。
如您所见,其中涉及很多幕后魔术,这就是为什么我通常只使用严格相等运算符的原因===。
第一个和第二个示例很容易理解,因为属性名称始终是字符串,因此
a[[2]] 相当于
a[[2].toString()] 这只是
a["2"] 请记住,在发生任何数组魔术之前,即使数字键也被视为属性名称(即字符串)。
问题来源于stack overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。