开发者社区> 问答> 正文

什么2 == [2]在JavaScript中?

我最近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发现。

展开
收起
保持可爱mmm 2020-02-06 23:03:44 1366 0
1 条回答
写回答
取消 提交回答
  • 您可以在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

    2020-02-06 23:04:06
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Delivering Javascript to World 立即下载
Javascript中的函数 立即下载
JavaScript函数 立即下载