Вопрос проверяет понимание ссылочного типа данных в JavaScript и как изменение массива через одну переменную влияет на другую переменную, что важно для избежания неожиданных мутаций.
В JavaScript объекты (включая массивы, функции и обычные объекты) являются ссылочными типами данных. Это означает, что переменная хранит не само значение, а адрес (ссылку) на место в памяти, где находятся данные. При присваивании массива другой переменной копируется именно эта ссылка, а не содержимое массива.
Рассмотрим пример:
let arr1 = [1, 2, 3];
let arr2 = arr1; // arr2 теперь ссылается на тот же массив
arr2.push(4); // Изменяем массив через arr2
console.log(arr1); // [1, 2, 3, 4] - arr1 также "видит" изменениеОбе переменные arr1 и arr2 указывают на один и тот же массив. Любая операция, изменяющая массив (мутация), такая как push, pop, splice или прямое присваивание по индексу, отразится при обращении через любую из переменных.
Это поведение используется для передачи массивов в функции без создания копий, что может быть эффективно по памяти. Однако оно часто приводит к багам, когда разработчик неосознанно изменяет исходные данные. Например, при работе с состоянием в React или Redux неожиданные мутации могут вызвать проблемы с рендерингом.
Чтобы избежать таких ситуаций, нужно создавать копии массива:
let copy = [...arr1]; или let copy = arr1.slice();let deepCopy = JSON.parse(JSON.stringify(arr1)); или с помощью structuredClone.Пример с копированием:
let original = [1, 2, 3];
let independentCopy = [...original]; // Создаётся новый массив
independentCopy.push(4);
console.log(original); // [1, 2, 3] - исходный массив не изменилсяВывод: Понимание ссылочной природы массивов критично для написания предсказуемого кода. Всегда учитывайте, что присваивание не создаёт копию данных. Если нужно работать с независимой версией массива, создавайте явную копию подходящим методом.