Передача данных по ссылке и по значению



Строки, числа, логические значения в JavaScript передаются по значению. Такое поведение удобно и предсказуемо.

Пример:

var a = 2;
b = a;
b+= 1;
console.log(a, b) // 2 3

a по-прежнему равно двум, b равно трём, изменения в b не затрагивают а, а изменения в а не влияют на b. Жизнь легка и прекрасна.

Объекты и массивы (которые тоже объекты) передаются по ссылке. Это значит, что где-то есть область памяти, где хранится созданный ранее объект и передать мы можем только ссылку на объект.

Из этого следуют неожиданные вещи.

1. Один объект не равен другому точно такому же объекту.

var a = [];
var b = [];
a == b   //  false



У а одна область памяти, у b – другая. а не равно b.
По той же причине

{a: 2} == {a: 2} // false

2. Изменения в одном объекте затрагивают другой объект (на самом деле тот же самый, но мы об этом можем не догадываться).

var a = [1, 2, 3, 4];
var b = a;
b.push(5);
console.log(a)  //   [1, 2, 3, 4, 5]


Как скопировать объект или массив

Метод Object.assign(copy, arr); можно использовать для копирования объекта или слияния нескольких объектов. В нём:
copy - куда копируем,
arr - откуда копируем.

var arr = [1, 2, 3, 4];
var copy = [];
Object.assign(copy, arr);
copy.push(5)
console.log(arr, copy) // [1, 2, 3, 4]    [1, 2, 3, 4, 5]


Для глубокого копирования объектов этот метод не подходит.