> Почему новый объект не изменяет исходный объект при передаче в функцию в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: IT-One, EdenAI, Яндекс

Стек: JavaScript

> Пример ответа

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

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

Подробное объяснение

В JavaScript примитивные типы передаются по значению, а объекты - по ссылке, но с важным нюансом: ссылка на объект передаётся как значение. Когда вы передаёте объект в функцию, параметр получает копию ссылки на тот же объект в памяти. Если внутри функции вы присваиваете параметру новый объект (например, param = {}), вы меняете только локальную переменную, а исходная ссылка остаётся неизменной. Однако, если вы мутируете свойства переданного объекта (например, param.key = value), изменения затронут исходный объект, так как обе переменные указывают на один и тот же объект.

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

На практике

В реальной разработке это важно учитывать при написании чистых функций (pure functions) и работе с иммутабельностью. Если вы хотите избежать мутаций исходного объекта, создавайте копию внутри функции (через spread-оператор, Object.assign или structuredClone). Если же нужно изменить исходный объект, мутируйте его свойства напрямую. Для глубоких структур используйте библиотеки вроде Immer или ручное копирование вложенных уровней.

Пример кода

JAVASCRIPT
function 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-уровня важно показать знание практических последствий: как избегать нежелательных мутаций, когда использовать копирование, как это влияет на производительность и архитектуру приложения.

Типичные ошибки

Кандидаты часто путают "передачу по ссылке" с возможностью изменить саму переменную. Ошибка: утверждать, что объекты передаются по ссылке, и поэтому присваивание нового объекта внутри функции изменит исходный. Другая ошибка - не различать мутацию свойств и перезапись переменной. Также иногда забывают, что примитивы ведут себя иначе, и пытаются применить к ним ту же логику.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью