@fleshik

Почему d[0] не изменяется?

Подскажите почему в примере
const a  =[{x:1}] 
const b = [...a] 

a[0].x =500; 
console.log(a[0]) 
console.log(b[0])

в консоли выводится в обоих случаях {x: 500},

но в примере
const c = [{x:1}]  
const d = [...c] 

c[0]=100;  
console.log(c[0])  
console.log(d[0])
console.log(d[0])

мы получаем {x:1}, а не 100, почему так происходит ? Почему при изменении c[0] у нас не изменяется d[0]?
  • Вопрос задан
  • 104 просмотра
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Объекты в JS копируются по ссылке. Таким образом, при декомпозиции массива c в d вы копируете ссылку на объект. В результате c[0] и d[0] содержат ссылку на один и тот же объект { x: 1 }.
Когда вы меняете свойство x, то изменения проводятся в экземпляре объекта по ссылке. При этом в массивах по прежнему находится одна и та же ссылка.
Когда вы меняете значение элемента массива c[0], то в массиве c находится новое значение, а в массиве d по прежнему хранится ссылка на объект.
Да, и массивы здесь не при чём. То же самое можно продемонстрировать и с обычными переменными:
a = { x: 1 };
b = a;
b.x = 100;
a; \\ { x: 100 }
b; \\ { x: 100 }
b = 100;
a; \\ { x: 100 }
b; \\ 100
Вот вам ещё пример ссылок:
a = { x: 1 };
b = a;
c = { x: 1 };
a === b; // true
a === c; // false
Ответ написан
Комментировать
MrDecoy
@MrDecoy Куратор тега JavaScript
Верставший фронтендер
Дак а чего вдруг ему меняться то?
Давайте по шагам:
// В первой строчке 3 шага
// 1) Создался новый массив
// 2) Создался новый объект {x:1}, и ссылка на него легла в первый элемент массива из шага 1.
// 3) В переменную "const c" положилась ссылка на массив из шага 1.
const c = [{x:1}]
// Вторая строчка так же содержит 3 шага
// 4) Создаётся новый массив
// 5) По ссылке массив "с" спрэдится. Т.о. первым элементом нового массива становится ссылка на объект из шага 2.
// 6) Ссылка на новый массив но со "старым" объектом кладётся в переменную "d"
const d = [...c] 
// Третья упрощённо имеет 1 шаг
// 7) в массив из переменной с именем "c" в первый элемент кладётся новое значение. Причём совершенно не важно какое.
c[0]=100;

На этом всё.
Таким образом получаем, что в массиве c в элементе с индексом 0 у нас число, а в массиве b в элементе с индексом 0 у нас ссылка на объект созданный на втором шаге.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы