Подтвердить что ты не робот

Почему два одинаковых объекта не равны друг другу?

Кажется, что следующий код должен возвращать true, но возвращает false.

var a = {};
var b = {};

console.log(a==b); //returns false
console.log(a===b); //returns false

Как это имеет смысл?

4b9b3361

Ответ 1

Единственное различие между регулярным (==) и строгим (===) равенством состоит в том, что строгий оператор равенства отключает преобразование типов. Поскольку вы уже сравниваете две переменные того же типа, используемый вами оператор равенства не имеет значения.

Независимо от того, используете ли вы регулярное или строгое равенство, сравнение объектов оценивается только с true , если вы сравниваете один и тот же точный объект.

То есть, данный var a = {}, b = a, c = {};, a == a, a == b, но a != c.

Два разных объекта (даже если оба они имеют нулевые или одинаковые точные свойства) никогда не будут сравнивать одинаково. Если вам нужно сравнить равенство двух свойств объекта, этот вопрос имеет очень полезные ответы.

Ответ 2

Как это имеет смысл?

Поскольку "равенство" ссылок на объекты в терминах операторов == и === имеет значение чисто на основе того, ссылаются ли ссылки на объект тот же, Это явно указано в абстрактный алгоритм сравнения равенства (используется ==) и строгий алгоритм сравнения равенства (используется ===).

В вашем коде, когда вы говорите a==b или a===b, вы не сравниваете объекты, вы сравниваете ссылки в a и b, чтобы увидеть, ссылаются ли они на один и тот же объект. Именно так определяется JavaScript и соответствует тому, как определены операторы равенства во многих (но не во всех) других языках (Java, С# [если оператор не переопределен, как это для string] и, например, С++).

JavaScript не имеет встроенной концепции эквивалентности, сравнения между объектами, которые указывают, являются ли они эквивалентными (например, имеют те же свойства с теми же значениями, что и Java Object#equals). Вы можете определить один в своей собственной базе кода, но там нет ничего внутреннего.

Ответ 3

===, оператор строго равен для проверки объектов для идентификации.

Два объекта строго равны, если они относятся к одному и тому же объекту.

Это два разных объекта, поэтому они отличаются.

Подумайте о двух пустых страницах бумаги. Их атрибуты одинаковы, но они не одно и то же. Если вы напишете что-нибудь на одном из них, другое не изменится.

Ответ 4

Как из окончательного руководства по Javascript.

Объекты не сравниваются по значению: два объекта не равны, даже если они имеют одинаковые свойства и значения. Это справедливо и для массивов: даже если они имеют одинаковые значения в одном и том же порядке.

var o = {x:1}, p = {x:1};  // Two objects with the same properties
o === p                    // => false: distinct objects are never equal 
var a = [], b = [];        // Two distinct, empty arrays 
a === b                    // => false: distinct arrays are never equal 

Ответ 5

use JSON.stringify(objname);

var a = {name : "name1"};
var b = {name : "name1"};

var c = JSON.stringify(a);
var d = JSON.stringify(b);

c==d;
//true

Ответ 6

Это обходное решение: Object.toJSON(obj1) == Object.toJSON(obj2)

Преобразуясь в строку, включение будет в основном состоять из строк