Мне нужна помощь, чтобы понять, почему между массивами создаются отношения, когда я реплицирую массив по ссылке. Возьмем следующий пример:
let a = [1,2,3];
let b = a;
b.push(4);
console.info(b); // [1,2,3,4]
console.info(a); // [1,2,3,4]
a === b; // true
По какой-то причине {a} изменяется, когда я изменяю {b}, когда я ожидал, что они будут независимыми массивами.
По-видимому, такое отношение неверно для переменных. Возьмем следующий пример:
let a = 'test';
let b = a;
b = 'test1';
console.info(b); // "test1"
console.info(a); // "test"
a === b; // false
Кто-нибудь знает причину поведения массивов?
В javascript только примитивы "передаются по значению". Технически массивы точно не передаются по ссылке, однако вы можете считать, что все, что не является примитивом в javascript, «передается по ссылке».
Что произойдет, если вы замените a='test'
на a=[1,2,3]
во втором фрагменте?
a
будет [1,2,3], а b
будет "test1". b
сначала будет указывать на a
, затем он будет присвоен новой строке, поэтому будет потеряна ссылка, а не значение a
.
Массивы копируются по ссылке, поэтому, когда вы пишете:
let b = a;
Вы ссылаетесь на a
в b
.
Правильный способ:
let b = [...a]
или
let b = a.slice(0);
Это происходит потому, что массивы являются ссылочными типами в JavaScript. Это означает, что если вы присваиваете массив переменной или передаете массив функции, копируется или передается ссылка на исходный массив, а не значение массива.