我想问一些奇怪的事情,即:
var x = "pl";
var y = ["pl"];
[x] == y; // false - why?
x == y; // true - how ?
x === y; // false - okay
有人可以解释一下吗?
提前致谢。
我想问一些奇怪的事情,即:
var x = "pl";
var y = ["pl"];
[x] == y; // false - why?
x == y; // true - how ?
x === y; // false - okay
有人可以解释一下吗?
提前致谢。
第一个是错误的,因为您正在比较两个数组(它们是对象) - 除非对象实际上是相同的 object,或者如果对象被强制转换为不同类型的值(如第二个),否则比较将始终为 false比较。
在第二次比较中, y 被强制为字符串值,然后发现等于"pl"
。
例如,这段代码:
["pl"] + "foo" → "plfoo"
顺便说一句,这就是为什么你应该总是使用===
而不是==
- 它不会导致任何令人惊讶的强制。这就是为什么第三个比较是错误的。
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。
[x] == y;
['pl'] == ['p1'] - 比较内存中 2 个不同数组的引用
x == y;
与 "pl" == ["p1"].toString() 相同。JS将第二个参数转换为字符串,因为第一个也是字符串