Передача объектов по ссылке в JavaScript

Массивы и объекты несколько отличаются от остальных примитивных типов данных. Сейчас мы посмотрим, в чем выражается это отличие.

Пусть у нас дан вот такой массив:

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);