Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: reference equality, object comparison, strict equality, JavaScript objects, identity operator

Что будет выведено при сравнении двух переменных, указывающих на один и тот же объект?

Вопрос проверяет понимание ссылочного равенства в JavaScript и зачем оно нужно для корректного сравнения объектов.

Короткий ответ

При сравнении двух переменных, указывающих на один и тот же объект, с помощью операторов строгого (===) или нестрогого (==) равенства, результатом будет true. Это происходит потому, что обе переменные содержат ссылку на один и тот же участок памяти, где хранится объект. В JavaScript объекты сравниваются по ссылке, а не по содержимому. Даже если два объекта имеют идентичные свойства и значения, но созданы отдельно, их сравнение вернёт false.

Длинный ответ

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

Сравнение по ссылке

Операторы равенства (== и ===) при работе с объектами сравнивают эти ссылки, а не содержимое объектов. Если две переменные содержат ссылку на один и тот же объект, сравнение вернёт true. В противном случае, даже если объекты выглядят идентично, результат будет false.

Пример кода

// Создаём объект
const obj1 = { name: 'Alice' };

// Присваиваем ссылку на этот объект другой переменной
const obj2 = obj1;

// Сравниваем переменные
console.log(obj1 === obj2); // true

// Создаём новый объект с таким же содержимым
const obj3 = { name: 'Alice' };

// Сравниваем obj1 и obj3
console.log(obj1 === obj3); // false
console.log(obj1 == obj3);  // false (нестрогое равенство тоже даёт false)

Где это применяется?

Понимание ссылочного равенства критически важно в нескольких сценариях:

  • Оптимизация производительности: React и другие библиотеки используют сравнение по ссылке для определения, изменились ли пропсы или состояние, чтобы избежать лишних ререндеров.
  • Работа с состояниями в Redux: Редюсеры должны возвращать новый объект состояния, а не мутировать старый, чтобы сравнение ссылок выявило изменение.
  • Управление кэшем и мемоизация: Функции вроде React.memo или библиотеки (Reselect) полагаются на сравнение ссылок входных аргументов.

Как сравнивать содержимое объектов?

Для сравнения по содержимому (глубокого сравнения) нужно использовать специальные методы:

  • Ручной обход свойств (только для простых объектов).
  • JSON.stringify() — если объект не содержит функций, undefined или циклических ссылок.
  • Использование библиотек, например, Lodash с функцией _.isEqual().
// Пример глубокого сравнения через JSON.stringify (с ограничениями)
const objA = { a: 1, b: { c: 2 } };
const objB = { a: 1, b: { c: 2 } };
console.log(JSON.stringify(objA) === JSON.stringify(objB)); // true

Вывод: Сравнение переменных, указывающих на один объект, всегда даёт true, так как сравниваются идентичные ссылки. Это фундаментальное поведение JavaScript, которое нужно учитывать при работе с состоянием приложений, оптимизации и избегании ошибок, связанных с непреднамеренной мутацией данных.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#reference equality

#object comparison

#strict equality

#JavaScript objects

#identity operator

Подпишись на React Developer в телеграм