Javascript:两个Object / Array之间的等式比较
让我们猜两个具有相同属性的对象:
var x = {a : 'some'}, y = {a: 'some'};
输出:
x == y;
和x === y;
两者都是假的
同样对于两个arrays,
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会做这样的事情? 请解释。
以上所有比较均为
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"
结尾。 所以我通常更喜欢===
(“严格平等”而不是==
(“松散平等”)。
这是因为
var p = [1, 2, 3], q = [1,2,3];
创建两个数组实例。 JS中的等式运算符在比较非原始数据时,只检查它们是否是同一个实例,不要对值或属性进行深入检查。
用代码
var p = q = [1, 2, 3];
您正在创建数组的一个实例并将此实例分配给变量p
和q
。 因此,两个变量都存储对同一实例的引用,因此相等运算符将返回true。
在这种情况下,变量指向两个单独的对象,因此不相等。
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