> В чем отличие передачи параметров по значению и по ссылке в 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 - возвращают новый массив;
  • для примитивов любые изменения внутри функции безопасны и не влияют на внешнюю переменную.

Пример кода

JAVASCRIPT
function 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 - нет;
  • отсутствие упоминания про примитивы и их копирование.

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

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