Передача данных по ссылке и по значению
Строки, числа, логические значения в 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]
Для глубокого копирования объектов этот метод не подходит.