> В чем отличие передачи параметров по значению и по ссылке в JavaScript? (JavaScript)

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

Компании: Яндекс

Стек: JavaScript

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

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

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

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

В JavaScript нет передачи по ссылке в классическом понимании (как в C++ или PHP). Есть два случая:

  • Примитивы (string, number, boolean, null, undefined, symbol, bigint) - передаются по значению. Функция получает копию значения, изменения параметра не влияют на оригинал.
  • Объекты (включая массивы, функции, даты) - передаются по значению ссылки. То есть в функцию передается копия ссылки на объект. Сама ссылка - это значение, но она указывает на тот же объект.

Ключевой момент: если внутри функции изменить свойство объекта, это изменение будет видно снаружи, потому что ссылка указывает на тот же объект. Но если переприсвоить параметр (например, param = {}), внешняя переменная не изменится - мы просто перезаписали локальную копию ссылки.

Это поведение часто называют "call by sharing" или "pass by value of reference".

На практике

На практике это означает:

  • Мутация объектов внутри функции - это side effect, который нужно контролировать.
  • Для защиты от мутаций используют иммутабельные подходы или копирование (spread, Object.assign, structuredClone).
  • Переприсваивание параметра - бесполезно для внешнего кода, но полезно для локальной логики.
  • Сравнение объектов по ссылке, а не по содержимому - следствие этого механизма.

Пример кода

JAVASCRIPT
// Примитив - передача по значению
function changePrimitive(x) {
x = 10;
}
let a = 5;
changePrimitive(a);
console.log(a); // 5 - не изменилось
// Объект - передача ссылки
function changeObject(obj) {
obj.name = 'new name';
}
const user = { name: 'old name' };
changeObject(user);
console.log(user.name); // 'new name' - изменилось
// Переприсваивание параметра
function reassignObject(obj) {
obj = { name: 'completely different' };
}
const anotherUser = { name: 'original' };
reassignObject(anotherUser);
console.log(anotherUser.name); // 'original' - не изменилось

Как отвечать на собеседовании

Начните с четкого разделения: примитивы - по значению, объекты - по значению ссылки. Подчеркните, что в JavaScript нет передачи по ссылке в классическом смысле. Приведите пример с мутацией и переприсваиванием. Упомяните, что это поведение одинаково для всех типов - просто для объектов "значение" - это ссылка. Если спросят про const - отметьте, что const запрещает переприсваивание переменной, но не запрещает мутацию объекта.

Что проверяет интервьюер

Интервьюер проверяет:

  • Понимание фундаментального механизма передачи параметров.
  • Умение предсказать поведение кода с мутациями.
  • Осознание разницы между изменением объекта и переприсваиванием.
  • Знание практических следствий: side effects, иммутабельность, копирование.
  • Способность объяснить простыми словами сложную тему.

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

  • Утверждение, что объекты передаются по ссылке - это неверно, передается значение ссылки.
  • Ожидание, что переприсваивание параметра изменит внешнюю переменную.
  • Игнорирование разницы между мутацией и переприсваиванием.
  • Путаница с const - думают, что const делает объект иммутабельным.
  • Непонимание, что массивы и функции - тоже объекты и ведут себя так же.

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

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