【发布时间】:2012-12-28 13:50:49
【问题描述】:
我想问一些奇怪的事情,即:
var x = "pl";
var y = ["pl"];
[x] == y; // false - why?
x == y; // true - how ?
x === y; // false - okay
谁能解释一下?
提前致谢。
【问题讨论】:
标签: javascript arrays compare
我想问一些奇怪的事情,即:
var x = "pl";
var y = ["pl"];
[x] == y; // false - why?
x == y; // true - how ?
x === y; // false - okay
谁能解释一下?
提前致谢。
【问题讨论】:
标签: javascript arrays compare
第一个是假的,因为您正在比较两个数组(它们是对象) - 除非对象实际上是 同一个对象、或 如果对象被强制转换为不同类型的值,如第二次比较。
第二次比较,y被强制为字符串值,然后发现等于"pl"。
例如,这段代码:
["pl"] + "foo" → "plfoo"
顺便说一句,这就是为什么您应该始终使用=== 而不是== - 它不会导致任何令人惊讶的强制转换。这就是为什么第三个比较是错误的。
【讨论】:
[x] == y 进行了浅比较,由于两者引用的不是同一个数组,所以返回false。
['a', 'b', 'c'].toString() → 'a,b,c'
Array to Array(抽象相等比较)
[x] == y; // false - why?
[x] 和 y 不引用同一个对象。 Arrays 是 objects 和 == 运算符测试它们是 same 对象,而不仅仅是所有属性具有相同值的两个对象。为了以那种方式确定对象相等性,您必须手动枚举每个对象的属性并测试每个值。
根据==使用的The Abstract Equality Comparison Algorithm:
如果 x 和 y 引用同一个对象,则返回 true。否则,返回 false。
字符串到数组(抽象相等比较)
x == y; // true - how ? oO
y,一个数组,被强制转换为一个字符串,因为您在将它与一个字符串x 进行比较时使用了==。
根据==使用的The Abstract Equality Comparison Algorithm:
如果 Type(x) 是 String 或 Number 并且 Type(y) 是 Object,则返回 比较的结果 x == ToPrimitive(y)。
字符串到数组(严格相等比较)
x === y; // fasle - okey
=== 与== 不同,它不会将y 强制转换为字符串...因此,您将字符串与对象进行比较。
根据===使用的The Strict Equality Comparison Algorithm:
如果 Type(x) 与 Type(y) 不同,则返回 false。
【讨论】:
[x] == y;
['pl'] == ['p1'] - 比较内存中 2 个不同数组的引用
x == y;
与 "pl" == ["p1"].toString() 相同。 JS将第二个参数转换为字符串,因为第一个也是字符串
【讨论】: