1

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

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做这样的事情?请解释。

4

3 回答 3

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"在右手侧)。所以我通常更喜欢===(“严格平等”而不是==(“松散平等”)。

于 2012-05-12T08:57:31.817 回答
3

发生这种情况是因为

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

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

带代码

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

您正在创建一个数组实例并将此实例分配给变量pq. 因此,两个变量都存储对同一个实例的引用,因此相等运算符将返回 true。

于 2012-05-12T08:58:29.147 回答
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
于 2012-05-12T09:00:00.907 回答