Вопрос проверяет понимание того, что объект в JS передаётся как значение-ссылка, поэтому изменение его свойств внутри функции отражается снаружи.
Если передать в функцию объект, можно изменить его свойства внутри функции, и эти изменения будут видны снаружи. Это происходит потому, что параметр получает копию ссылки на один и тот же объект. Пока ты меняешь свойства (например, obj.count++), ты работаешь с тем же объектом. Но если ты переприсвоишь сам параметр (например, obj = {}), внешний объект не изменится.
Этот вопрос помогает понять важную модель: функция получает копию ссылки на объект, поэтому обе стороны “смотрят” на один и тот же объект в памяти.
Определение: Изменение объекта (mutation) — это изменение его внутреннего состояния (например, свойств), без создания нового объекта.
function incrementCounter(state) {
state.count += 1;
}
const state = { count: 0 };
incrementCounter(state);
console.log(state.count); // 1
Почему это работает:
state хранит ссылку на объект { count: 0 }.
В функцию передаётся значение этой ссылки (копия ссылки).
Параметр функции указывает на тот же объект.
state.count += 1 меняет объект, поэтому результат виден снаружи.
Изменение свойства меняет тот же объект:
function setName(user) {
user.name = 'Ann';
}
const u = { name: 'Bob' };
setName(u);
console.log(u.name); // 'Ann'
Переприсваивание параметра не меняет внешний объект:
function replaceUser(user) {
user = { name: 'Ann' }; // новый объект, но ссылка только в локальном параметре
}
const u = { name: 'Bob' };
replaceUser(u);
console.log(u.name); // 'Bob'
Тут есть два распространённых подхода — выбор зависит от стиля кода и требований.
Императивно (мутировать объект)
удобно в простом коде
быстро и без лишних аллокаций
но есть риск неожиданных побочных эффектов
Функционально (возвращать новый объект)
предсказуемее, особенно в UI
проще отслеживать изменения и делать сравнения
часто используется в React/Redux-подходах
Пример без мутаций:
function incrementCounter(state) {
return { ...state, count: state.count + 1 };
}
let state = { count: 0 };
state = incrementCounter(state);
В React состояние обычно обновляют без мутаций, чтобы сравнение ссылок помогало понять, что данные изменились.
Но локальные объекты (не state) можно мутировать, если это не влияет на рендер-логику.
Вывод: чтобы “изменить данные через функцию”, передавай объект и меняй его свойства — изменения будут видны снаружи, потому что функция получает копию ссылки на один и тот же объект. Если важна предсказуемость (например, в React), чаще возвращают новый объект вместо мутаций.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию