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

Сравнение объектов в JavaScript

У меня есть этот код:

var object1 = {same:'test'}
var object2 = {same:'test'};       
console.log(object1 === object2)

Он возвращает false в консоли.

У меня также есть этот код:

var object1 = {same:'test'}
var object2 = object1;
console.log(object1 === object2)  

Он возвращает true в консоли.

Я знаю, что '===' является оператором равенства, но я не знаю, как он работает с объектами.

Почему первый пример возвращает false?

4b9b3361

Ответ 1

Посмотри этот мяч? Его цвет красный. Назовите это ball1.

Посмотри этот мяч? Его цвет красный. Назовите это ball2.

Является ли ball1 тем же объектом, что и ball2? Нет, это разные объекты, которые имеют одинаковые свойства.


Посмотри этот мяч? Его цвет красный. Назовите это ball1.

Пусть вызов ball1, ball2.

Является ли ball1 тем же объектом, что и ball2? Да. Это тот же шар.

Ответ 2

Объекты сравниваются по ссылочному равенству, а поскольку object1 и object2 - это два разных экземпляра, они представляют собой разные объекты (думайте об этом как: они занимают разные места в памяти).

Если вы назначаете object1 объекту2, они оба указывают на одно и то же место в памяти и, следовательно, равны (они являются двумя ссылками на один и тот же единственный объект, он существует только один раз в памяти). Изменение свойства через object1.same = 'uiae'; также обновит свойство object2.same (потому что они на самом деле являются одним и тем же идентичным объектом и тем же свойством)

Ответ 3

var object1 ={same:'test'}
var object2 ={same:'test'};       
console.log(object1 === object2)

В этом случае вы создаете два разных объекта. поэтому он возвращает значение false в консоли при проверке с помощью оператора ===.

var object1 ={same:'test'}
var object2 =object1;
console.log(object1 === object2)

В этом случае вы создаете один объект и объект1 и объект2, ссылающийся на созданный объект, поэтому он возвращает true, когда вы проверяете оператор ===.

Во втором случае, если мы изменим значение object2["same"]="test2", тогда значение object1 [ "same" ] также будет изменено на test2.

В первом случае это не произойдет, потому что object1 и object2 - это два разных объекта.

укажите это: Равенство объектов в JavaScript

надеется, что это может быть полезно.

Ответ 4

В первом случае Object1 и Object2 представляют собой две разные контрольные точки (или переменные), указывающие на два разных объекта в памяти. Когда вы проверяете их на равенство, результат является ложным.

Во втором случае вы просто копируете контрольную точку (адрес) из Object1 в Object2, что означает, что опорные точки теперь ссылаются на один и тот же объект в памяти. Результат - true.

Объекты всегда сравниваются по ссылке.

Ответ 5

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

Каждый раз, когда вы пишете литерал объекта или массива, он создает другой объект или массив, поэтому они не равны, даже если содержимое похоже.

Ответ 6

Когда вы создали объект таким образом, вы создали карту. Нет ничего подобного ценности карты, как ее не примитивных типов. Таким образом, равные будут просто проверять ссылочное равенство. Следовательно, это не удается. Во втором случае выполняется ссылочное равенство.

Ответ 7

Два разных объекта не могут быть равны друг другу по определению в JavaScript. Равные атрибуты и ценности не важны. У них разные указатели (первый пример).

Во втором примере вы клонируете объект ссылкой. Поэтому "===" вернет true.

Ответ 8

В первом примере вы создали два разных объекта с произвольным контентом, который является случайным образом: {same:'test'} и {same:'test'}

В вашем втором примере вы создали только один объект и сохранили его в двух переменных: object1 и object2

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

Ответ 9

Ваш пример не связан с различием оператора == vs ===. Как объяснялось ранее, ваш пример просто создает два разных объекта, а в следующем примере - то же самое. Оба == и === будут действовать одинаково.

Так как объекты litterals всегда объекты litterals и никоим образом неявно конвертируемые, == и === всегда будут действовать одинаково для объектов litterals. Некоторые другие типы, такие как NaN, null и т.п., Вы получаете странные/забавные результаты при сравнении с == и ===