我最近在 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/