JavaScript

Почему 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]?
Anatolij Baranovskij
Anatolij Baranovskij
395
В примере с const a и const b мы изменяем свойство x объекта, который находится в массиве a. Объекты в JavaScript передаются по ссылке, поэтому когда мы изменяем свойство x объекта, который находится в массиве a, мы также изменяем этот объект в массиве b, потому что b содержит ссылку на тот же объект.

В примере с const c и const d мы изменяем сам элемент массива c, а не его свойство. Когда мы присваиваем c[0] = 100, мы создаем новый объект со свойством x равным 100 и присваиваем его вместо старого объекта в массиве c. Поскольку d содержит ссылку на старый объект, который был заменен, его значение не изменяется.

Если мы хотим изменить значение элемента массива c и иметь это изменение отражено в массиве d, мы можем изменить свойство объекта, который находится в массиве c, а не сам элемент массива. Например:

const c = [{x:1}]
const d = [...c]

c[0].x = 100; // изменяем свойство объекта, который находится в массиве c
console.log(c[0]) // {x: 100}
console.log(d[0]) // {x: 100}


В этом примере мы изменяем свойство x объекта, который находится в массиве c, и это изменение отражается в массиве d, потому что оба массива содержат ссылку на тот же объект.
Мерхат Искаков
Мерхат Искаков
14 368
Лучший ответ
Во всех случаях у тебя все массивы разные. Изменяя значения массива, остальные не затрагиваются.
Но разница в том, что в первом случае ты изменяешь не значение массива а свойство объекта, который внутри массива. Так как оба массива содержат один и тот же объект, изменения будут и там и там.
Борис Лейченко
Борис Лейченко
23 960
В первом примере с массивом a и b, оператор расширения (...) используется для создания поверхностной копии массива a, то есть новый массив b содержит ссылки на те же объекты, что и массив a. Поэтому, когда вы изменяете свойство x объекта a[0], изменения отражаются и в объекте b[0], так как они ссылаются на один и тот же объект.

Во втором примере с массивом c и d, когда вы присваиваете c[0] = 100, вы фактически заменяете ссылку на объект в массиве c. Но массив d все еще содержит старую ссылку на объект {x: 1}, поскольку он был скопирован при создании массива d с использованием оператора расширения. Поэтому изменение c[0] не влияет на массив d, и его первый элемент остается неизменным.
Р-
Русский -_-_
3 288