> В чем отличие передачи параметров по значению и по ссылке в 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делает объект иммутабельным. - Непонимание, что массивы и функции - тоже объекты и ведут себя так же.
> Похожие задачи по frontend
Как работает JSON и как передается информация с его помощью?
Почему нельзя использовать Promise.all для решения задачи с покупателями в JavaScript
В чем отличие массивов от объектов в JavaScript
Какие способы выполнения HTTP-запросов в браузере на JavaScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью