> В чем отличие передачи параметров по значению и по ссылке в JavaScript? (JavaScript)
Уровень: middle · Роль: frontend · Категория: Технические вопросы
Компании: JSA GROUP
Стек: JavaScript
> Пример ответа
Короткий ответ
В JavaScript параметры всегда передаются по значению, но для объектов это значение является ссылкой на объект. Примитивы копируются полностью, а объекты и массивы передаются как копия ссылки. Изменение свойства объекта внутри функции повлияет на оригинал, а переприсваивание параметра - нет.
Подробное объяснение
В JavaScript нет передачи по ссылке в классическом понимании (как в C++). Есть два механизма:
- для примитивов (string, number, boolean, null, undefined, symbol, bigint) - передаётся копия значения;
- для объектов (включая массивы и функции) - передаётся копия ссылки на объект в памяти.
Ключевой момент: сама ссылка передаётся по значению. Это значит, что внутри функции параметр - это новая переменная, которая указывает на тот же объект. Если изменить содержимое объекта через эту ссылку - изменения видны снаружи. Если присвоить параметру новый объект - внешняя переменная не изменится.
На практике
На практике это означает:
- мутация объекта внутри функции - это побочный эффект, который виден вызывающему коду;
- для защиты от мутаций используют иммутабельные подходы (spread, Object.assign, structuredClone);
- при работе с массивами методы вроде push, splice меняют оригинал, а map, filter - возвращают новый массив;
- для примитивов любые изменения внутри функции безопасны и не влияют на внешнюю переменную.
Пример кода
JAVASCRIPTfunction changePrimitive(value) {value = 100; // меняем копию}function changeObject(obj) {obj.name = 'updated'; // мутируем объект через ссылку}function reassignObject(obj) {obj = { name: 'new object' }; // переприсваиваем параметр}let num = 1;changePrimitive(num);console.log(num); // 1 - примитив не изменилсяlet user = { name: 'original' };changeObject(user);console.log(user.name); // 'updated' - объект изменёнreassignObject(user);console.log(user.name); // 'updated' - переприсваивание не повлияло
Как отвечать на собеседовании
Начни с чёткого разделения: примитивы - по значению, объекты - по ссылке, но ссылка передаётся по значению. Подчеркни разницу между мутацией объекта и переприсваиванием параметра. Приведи пример с функцией, которая меняет свойство объекта, и объясни, почему это работает. Если спросят про массивы - упомяни методы, которые мутируют, и те, которые возвращают новый массив. Хорошо добавить про иммутабельность как способ избежать побочных эффектов.
Что проверяет интервьюер
Интервьюер проверяет:
- понимание разницы между примитивами и объектами;
- знание того, что ссылка передаётся по значению;
- умение предсказать поведение кода с мутациями;
- осознание практических последствий для архитектуры (побочные эффекты, иммутабельность);
- способность объяснить простыми словами сложную тему.
Типичные ошибки
- утверждение, что объекты передаются по ссылке - это неверно, передаётся копия ссылки;
- ожидание, что переприсваивание параметра изменит внешнюю переменную;
- игнорирование разницы между мутацией и переприсваиванием;
- путаница с методами массивов: push меняет оригинал, concat - нет;
- отсутствие упоминания про примитивы и их копирование.
> Похожие задачи по frontend
Какие способы выполнения HTTP-запросов в браузере на JavaScript?
Можно ли сравнить два объекта в JavaScript и как это сделать
Как сборщик мусора находит неиспользуемые объекты в JavaScript
Почему для обработки промисов используют конструкции вместо console.log напрямую
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью