Javascript: сравнение равенства между двумя объектами / массивами

Давайте угадать два объекта с одинаковым свойством:

<code>var x = {a : 'some'},
      y = {a: 'some'};
</code>

выход:

x == y; а такжеx === y; оба дают ложные

Аналогично для двух массивов,

<code>var p = [1, 2, 3],
      q = [1,2,3];
</code>

p == q а такжеp === q оба даютfalse.

Но если я сделаю следующее:

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

Все приведенные выше сравнения даютtrue.

Почему Javascript делает такую вещь? Объясните пожалуйста.

Ответы на вопрос(3)

Это происходит потому, что

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

создает два экземпляра массивов. Операторы равенства в JS, при сравнении не примитивных данных, проверяют только, являются ли они одним и тем же экземпляром, не выполняйте глубокую проверку значений или свойств.

С кодом

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

вы создаете ОДИН экземпляр экземпляра массива и назначаете этот экземпляр переменнымp а такжеq. Итак, обе переменные хранят ссылку на один и тот же экземпляр, поэтому оператор равенства вернет true.

 Amadan12 мая 2012 г., 10:59
+ 1. ПодробнееВо.

поэтому они не равны.

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
Решение Вопроса

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"

The Содержание объектов не имеет значения, проверяется их личность.

Обратите внимание, что это не так, если вы используете== и только одна сторона является ссылкой на объект (например, другая сторона является числом, примитивной строкой,undefined, так далее.). В этом случае ссылку на объект попросят преобразовать себя (либо в строку, либо в число, в зависимости от того, что является другой вещью), а затем преобразованный результат будет использован для сравнения. Это может привести к неожиданному поведению (например,"2" == [[[[[2]]]]] являетсяtrue потому что массив просят превратить себя в строку, что он делает черезjoin [который попросит свой элемент преобразовать себя в строку и т. д.], и вы получите"2" на правой стороне). Поэтому я обычно предпочитаю=== ("строгое равенство" над== ("слабое равенство").

 benqus12 мая 2012 г., 11:00
Да, var x = {a: 'some'}, y = {a: 'some'}; указывают на ДВА различных - в памяти, но похожих - объекта.

Ваш ответ на вопрос