Javascript:两个Object / Array之间的等式比较

时间:2012-05-12 08:52:21

标签: javascript jquery

让我们猜测两个具有相同属性的对象:

var x = {a : 'some'},
      y = {a: 'some'};

输出:

x == y;x === y;都给出了错误的

同样对于两个数组,

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会这样做?请解释一下。

3 个答案:

答案 0 :(得分:5)

  

以上所有比较均为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"。所以我通常更喜欢===(“严格平等”而不是==(“宽松平等”)。

答案 1 :(得分:3)

这是因为

var p = [1, 2, 3],
q = [1,2,3];

创建两个数组实例。 JS中的等式运算符在比较非原始数据时,只检查它们是否是同一个实例,不要对值或属性进行深入检查。

使用代码

var p = q = [1, 2, 3];

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