4

可能重复:
为什么 [] == [] 在 javascript 中为假?

我想问一些奇怪的事情,即:

var x = "pl";
var y = ["pl"];
[x] == y; // false - why?
x == y; // true - how ? 
x === y; // false - okay

有人可以解释一下吗?

提前致谢。

4

3 回答 3

4

第一个是错误的,因为您正在比较两个数组(它们是对象) - 除非对象实际上是相同的 object或者如果对象被强制转换为不同类型的值(如第二个),否则比较将始终为 false比较。

在第二次比较中, y 被强制为字符串值,然后发现等于"pl"

例如,这段代码:

["pl"] + "foo" → "plfoo"

顺便说一句,这就是为什么你应该总是使用===而不是==- 它不会导致任何令人惊讶的强制。这就是为什么第三个比较是错误的。

于 2012-12-28T13:53:15.703 回答
2

Array to Array(抽象相等比较)

[x] == y; // false - why?

[x]并且y不要引用同一个对象。数组对象==运算符测试它们是否是同一个对象,而不仅仅是两个对象的所有属性都具有相同的值。为了以这种方式确定对象相等性,您必须手动枚举每个对象的属性并测试每个值。

根据使用的抽象等式比较算法==

如果 x 和 y 引用同一个对象,则返回 true。否则,返回假。

字符串到数组(抽象相等比较)

x == y; // true - how ? oO

y,一个数组,被强制转换为一个字符串,因为您==在将它与x一个字符串进行比较时使用了它。

根据使用的抽象等式比较算法==

如果 Type(x) 是 String 或 Number 且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。

字符串到数组(严格相等比较)

x === y; // fasle - okey

===, 不像==,不会强制y转换成字符串...所以,您将字符串与对象进行比较。

根据使用的严格等式比较算法===

如果 Type(x) 与 Type(y) 不同,则返回 false。

于 2012-12-28T13:56:53.973 回答
0
[x] == y; 

['pl'] == ['p1'] - 比较内存中 2 个不同数组的引用

x == y; 

与 "pl" == ["p1"].toString() 相同。JS将第二个参数转换为字符串,因为第一个也是字符串

于 2012-12-28T14:06:40.850 回答