Массивы и объекты несколько отличаются от остальных примитивных типов данных. Сейчас мы посмотрим, в чем выражается это отличие.
Пусть у нас дан вот такой массив:
let a = [1, 2, 3];
Давайте скопируем этот массив в переменную
b
:
let a = [1, 2, 3];
let b = a;
Если бы мы имели дело с примитивами, то переменная
b
получила бы копию значения переменной
a
.
В случае с массивами и объектами все работает
по другому. При такой операции, как вы выполнили
выше, переменная b
не копирует содержимое
переменной a
, а обе эти переменные
начинают ссылаться на один и тот же массив.
На практике это означает то, что при изменении массива с помощью одной переменной, эти изменения автоматически появятся во второй переменной.
Смотрите пример:
let a = [1, 2, 3];
let b = a;
b[0] = '!'; // меняем массив из переменной b
console.log(a[0]); // выведет '!' - переменная a тоже поменялась
Обратите внимание на то, что такой эффект связи переменных будет только тогда, когда мы меняем часть массива или объекта.
Если у нас есть две переменные, ссылающиеся на объект, то запись примитива в одну из переменных не повлияет на вторую переменную - она по-прежнему будет указывать на тот же объект:
let a = [1, 2, 3];
let b = a; // на объект ссылается и a, и b
a = 'primitive'; // запишем в a какой-то примитив
console.log(b); // выведет [1, 2, 3]
Кроме того, даже если записать в какую-то переменную другой массив или объект - это тоже не повлияет на вторую переменную:
let a = [1, 2, 3];
let b = a;
a = [3, 4, 5]; // запишем в a массив
console.log(b); // выведет [1, 2, 3]
console.log(a); // выведет [3, 4, 5]
Не запуская код, определите, что выведется в консоль:
let arr1 = [1, 2, 3];
let arr2 = arr1;
arr1[0] = 'a';
console.log(arr2);
Не запуская код, определите, что выведется в консоль:
let arr1 = [1, 2, 3];
let arr2 = arr1;
arr1[0] = 'a';
arr2[1] = 'b';
console.log(arr1);
Не запуская код, определите, что выведется в консоль:
let arr1 = [1, 2, 3];
let arr2 = arr1;
arr1[0] = 'a';
arr2[0] = 'b';
console.log(arr2);