> Почему новый объект не изменяет исходный объект при передаче в функцию в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: IT-One, EdenAI, Яндекс
Стек: JavaScript
> Пример ответа
Короткий ответ
В JavaScript объекты передаются по ссылке, но сама ссылка передаётся по значению. Когда вы передаёте объект в функцию, создаётся копия ссылки на тот же объект в памяти. Новый объект, созданный внутри функции, не изменяет исходный, потому что операция присваивания перезаписывает локальную переменную, а не модифицирует исходный объект.
Подробное объяснение
В JavaScript примитивные типы передаются по значению, а объекты - по ссылке, но с важным нюансом: ссылка на объект передаётся как значение. Когда вы передаёте объект в функцию, параметр получает копию ссылки на тот же объект в памяти. Если внутри функции вы присваиваете параметру новый объект (например, param = {}), вы меняете только локальную переменную, а исходная ссылка остаётся неизменной. Однако, если вы мутируете свойства переданного объекта (например, param.key = value), изменения затронут исходный объект, так как обе переменные указывают на один и тот же объект.
Это поведение связано с тем, что переменные в JavaScript - это просто указатели на значения в памяти. При передаче в функцию создаётся новая переменная в стеке вызовов, которая копирует значение указателя. Изменение самой переменной (присваивание нового объекта) не влияет на исходную переменную, так как они независимы.
На практике
В реальной разработке это важно учитывать при написании чистых функций (pure functions) и работе с иммутабельностью. Если вы хотите избежать мутаций исходного объекта, создавайте копию внутри функции (через spread-оператор, Object.assign или structuredClone). Если же нужно изменить исходный объект, мутируйте его свойства напрямую. Для глубоких структур используйте библиотеки вроде Immer или ручное копирование вложенных уровней.
Пример кода
JAVASCRIPTfunction modifyObject(obj) {// Мутация: изменяет исходный объектobj.name = 'changed';// Присваивание нового объекта: не влияет на исходныйobj = { name: 'new object' };console.log('Inside function:', obj.name); // 'new object'}const original = { name: 'original' };modifyObject(original);console.log('Outside function:', original.name); // 'changed', а не 'original'
Как отвечать на собеседовании
Начните с ключевого тезиса: "объекты передаются по ссылке, но ссылка - по значению". Приведите пример с мутацией и присваиванием, чтобы показать разницу. Упомяните, что это фундаментальное поведение JavaScript, связанное с управлением памятью. Если собеседник спросит про примитивы, объясните, что они передаются по значению целиком. Для senior-уровня добавьте контекст про стек и кучу (heap), а также про иммутабельность в функциональном программировании.
Что проверяет интервьюер
Интервьюер оценивает понимание модели памяти JavaScript, различие между передачей по ссылке и по значению, а также способность объяснить нюансы работы с объектами. Для senior-уровня важно показать знание практических последствий: как избегать нежелательных мутаций, когда использовать копирование, как это влияет на производительность и архитектуру приложения.
Типичные ошибки
Кандидаты часто путают "передачу по ссылке" с возможностью изменить саму переменную. Ошибка: утверждать, что объекты передаются по ссылке, и поэтому присваивание нового объекта внутри функции изменит исходный. Другая ошибка - не различать мутацию свойств и перезапись переменной. Также иногда забывают, что примитивы ведут себя иначе, и пытаются применить к ним ту же логику.
> Похожие задачи по frontend
Что такое метод map в JavaScript и как он работает
Как работает конструктор Promise, синхронность создания и асинхронность резолва в JavaScript
Можно ли сравнить два объекта в JavaScript и как это сделать
Как сравнить массивы аргументов для кеширования в функции memo в JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью