javascript - 为什么 2 == [2] 在 JavaScript 中?

标签 javascript arrays properties

我最近在 JavaScript 中发现了 2 == [2]。事实证明,这个怪癖有几个有趣的后果:

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?

最佳答案

您可以在 ECMA 规范中查找比较算法(ECMA-262 第 3 版中针对您的问题的相关部分: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"]

请记住,在任何数组魔术发生之前,即使是数字键也被视为属性名称(即字符串)。

关于javascript - 为什么 2 == [2] 在 JavaScript 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1724255/

相关文章:

javascript - 有多少网站使用 JavaScript?

javascript - 通过 javascript 和 php 对表以及其他一些选择标准进行动态排序

java - 使用字符串数组初始化 JComboBox 对象

javascript - 为什么谷歌闭包编译器会警告数组的长度?

php - CSS 在 PHP 代码后丢失属性?

java - list 与属性文件格式

javascript - 在 Bokeh 上将文件从服务器发送到客户端

javascript - 如何检查 JavaScript 中的变量是否已加载?

javascript - 我如何创建一个可重用的函数来为变量对象属性设置状态?

javascript - 我什么时候应该初始化 javascript 属性?