让我们猜测两个具有相同属性的对象:
var x = {a : 'some'},
y = {a: 'some'};
输出:
x == y;
和x === y;
都给出了错误的
同样对于两个数组,
var p = [1, 2, 3],
q = [1,2,3];
p == q
和p === q
都提供false
。
但如果我遵循以下内容:
var x = y = {a: 'some'};
var p = q = [1, 2, 3];
以上所有比较均为true
。
为什么Javascript会这样做?请解释一下。
答案 0 :(得分:5)
以上所有比较均为
true
。
右。您已经专门设置了p
和q
,因此它们引用了同一个对象。
使用对象引用时,==
(如果双方都是对象引用)和===
都将检查引用是否指向同一对象。如果您有两个相同但独立的对象,则两者始终为false
。
例如:
var a = {}; // a points to an object
var b = {}; // b points to a _different_ object
console.log(a === b); // "false"
console.log(a == b); // "false"
var c = {}; // c points to an object
var d = c; // d points to _the same_ object
console.log(c === d); // "true"
console.log(c == d); // "true"
对象的内容是无关紧要的,它是被检查的身份。
请注意,如果您使用==
并且只有一方是对象引用(例如,另一方是数字,原始字符串,undefined
等),则情况并非如此。在这种情况下,将要求对象引用自身转换(转换为字符串或数字,具体取决于其他内容),然后转换后的结果将用于比较。这可能导致令人惊讶的行为(例如,"2" == [[[[[2]]]]]
是true
,因为要求数组将自身转换为字符串,它通过join
[它将要求其元素转换本身到一个字符串,依此类推],你最后在右边有"2"
。所以我通常更喜欢===
(“严格平等”而不是==
(“宽松平等”)。
答案 1 :(得分:3)
这是因为
var p = [1, 2, 3],
q = [1,2,3];
创建两个数组实例。 JS中的等式运算符在比较非原始数据时,只检查它们是否是同一个实例,不要对值或属性进行深入检查。
使用代码
var p = q = [1, 2, 3];
您正在创建数组的一个实例,并将此实例分配给变量p
和q
。因此,两个变量都存储对同一实例的引用,因此相等运算符将返回true。
答案 2 :(得分:2)
在这种情况下,变量指向两个独立的对象,因此不相等。
var x = {a:'some'}, // one object with "a" = "some"
y = {a:'some'}; // another object with "a" = "some"
var p = [1,2,3], // one array with 1,2 and 3
q = [1,2,3]; // another array with 1,2 and 3
但在这种情况下,它们指向同一个对象,因此等于
var x = y = {a: 'some'};
//is like:
var x = {a:'some'}, // x points to an object
y = x; // y is given reference to whatever x is pointing at
var p = q = [1,2,3];
//is like:
var p = [1,2,3], // p points to an array
q = p; // q is given reference to whatever p is pointing at