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 == qp === q都给出了false

但是,如果我这样做:

 var x = y = {a: 'some'}; var p = q = [1, 2, 3]; 

以上所有比较均为true

为什么Javascript会做这样的事情? 请解释。

以上所有比较均为true

对。 你专门设置了pq所以他们引用了同一个对象。

对于对象引用,两者都== (如果双方都是对象引用),则===将检查引用是否指向同一对象 。 如果您有两个相同但独立的对象,则两者都将始终为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]; 

您正在创建数组的一个实例并将此实例分配给变量pq 。 因此,两个变量都存储对同一实例的引用,因此相等运算符将返回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