Кажется, что следующий код должен возвращать true, но возвращает false.
var a = {};
var b = {};
console.log(a==b); //returns false
console.log(a===b); //returns false
Как это имеет смысл?
Кажется, что следующий код должен возвращать true, но возвращает false.
var a = {};
var b = {};
console.log(a==b); //returns false
console.log(a===b); //returns false
Как это имеет смысл?
Единственное различие между регулярным (==
) и строгим (===
) равенством состоит в том, что строгий оператор равенства отключает преобразование типов. Поскольку вы уже сравниваете две переменные того же типа, используемый вами оператор равенства не имеет значения.
Независимо от того, используете ли вы регулярное или строгое равенство, сравнение объектов оценивается только с true
, если вы сравниваете один и тот же точный объект.
То есть, данный var a = {}, b = a, c = {};
, a == a
, a == b
, но a != c
.
Два разных объекта (даже если оба они имеют нулевые или одинаковые точные свойства) никогда не будут сравнивать одинаково. Если вам нужно сравнить равенство двух свойств объекта, этот вопрос имеет очень полезные ответы.
Как это имеет смысл?
Поскольку "равенство" ссылок на объекты в терминах операторов ==
и ===
имеет значение чисто на основе того, ссылаются ли ссылки на объект тот же, Это явно указано в абстрактный алгоритм сравнения равенства (используется ==
) и строгий алгоритм сравнения равенства (используется ===
).
В вашем коде, когда вы говорите a==b
или a===b
, вы не сравниваете объекты, вы сравниваете ссылки в a
и b
, чтобы увидеть, ссылаются ли они на один и тот же объект. Именно так определяется JavaScript и соответствует тому, как определены операторы равенства во многих (но не во всех) других языках (Java, С# [если оператор не переопределен, как это для string
] и, например, С++).
JavaScript не имеет встроенной концепции эквивалентности, сравнения между объектами, которые указывают, являются ли они эквивалентными (например, имеют те же свойства с теми же значениями, что и Java Object#equals
). Вы можете определить один в своей собственной базе кода, но там нет ничего внутреннего.
===
, оператор строго равен для проверки объектов для идентификации.
Два объекта строго равны, если они относятся к одному и тому же объекту.
Это два разных объекта, поэтому они отличаются.
Подумайте о двух пустых страницах бумаги. Их атрибуты одинаковы, но они не одно и то же. Если вы напишете что-нибудь на одном из них, другое не изменится.
Как из окончательного руководства по 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
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
Это обходное решение: Object.toJSON(obj1) == Object.toJSON(obj2)
Преобразуясь в строку, включение будет в основном состоять из строк