Вопрос проверяет понимание механизма присваивания по ссылке для объектов и массивов в JavaScript, что критически важно для избежания неожиданных мутаций данных.
В JavaScript примитивные типы (числа, строки, булевы значения) присваиваются по значению, то есть создаётся новая копия данных. Однако объекты (включая массивы и функции) присваиваются по ссылке. Это означает, что переменная хранит не сам объект, а адрес в памяти, где он находится.
Когда вы присваиваете объект или массив другой переменной, вы копируете только эту ссылку, а не содержимое. Обе переменные начинают указывать на один и тот же объект в памяти. Любые изменения, сделанные через одну переменную, немедленно видны через другую.
const original = { name: 'Alice', age: 30 };
const copy = original; // Копируется ссылка, а не объект
copy.age = 31;
console.log(original.age); // 31 — оригинальный объект тоже изменился!
// Аналогично с массивами
const arr1 = [1, 2, 3];
const arr2 = arr1;
arr2.push(4);
console.log(arr1); // [1, 2, 3, 4]
Чтобы избежать нежелательного совместного использования данных, нужно создать новый объект или массив, скопировав содержимое старого. Это называется поверхностным клонированием.
{...obj} или Object.assign({}, obj).[...arr], метод arr.slice() или Array.from(arr).const shallowCopy = { ...original };
shallowCopy.age = 40;
console.log(original.age); // 31 — оригинал остался неизменным
Важно помнить, что это поверхностное копирование. Если свойствами объекта являются другие объекты, они всё равно будут скопированы по ссылке. Для глубокого копирования потребуются более сложные методы, например, JSON.parse(JSON.stringify(obj)) (с ограничениями) или библиотечные функции.
Понимание этого механизма необходимо при работе с состоянием в React, Redux или Vue, где непреднамеренная мутация объекта состояния может привести к багам и сложностям в отладке. Также это важно при передаче объектов в качестве аргументов функций, при работе с API, возвращающими сложные структуры данных, и при любых операциях, требующих модификации данных без влияния на оригинал.
Вывод: Присваивание по ссылке — фундаментальная особенность JavaScript для объектов и массивов. Она позволяет эффективно работать с большими структурами данных, но требует осторожности. Всегда создавайте явные копии, когда нужно изменить данные, не затрагивая исходный объект.