Почему при изменении объекта он не меняется в массиве?

В JavaScript объекты передаются по ссылке, а не по значению. Оно означает, что когда мы помещаем объект в массив, мы на самом деле помещаем ссылку на этот объект.

Давайте рассмотрим пример:

const obj = { name: 'John' };
const arr = [obj];

obj.name = 'David';

console.log(arr[0].name); // David

В приведенном выше примере мы создаем объект obj с свойством name равным 'John'. Затем мы создаем массив arr и помещаем obj в него. Затем мы изменяем свойство name объекта obj на 'David'. При выводе на консоль значение свойства name элемента массива arr также изменяется на 'David'.

Это происходит потому, что arr содержит ссылку на объект obj, а не сам объект. Когда мы изменяем свойство объекта через ссылку (например, obj.name = 'David'), изменение отражается на всех ссылках на этот объект, в том числе и в элементах массива arr.

Однако, если мы полностью заменим объект в массиве на новый, изменения в оригинальном объекте не будут отражаться. Рассмотрим следующий пример:

const obj = { name: 'John' };
const arr = [obj];

const newObj = { name: 'David' };
arr[0] = newObj;

console.log(obj.name); // John
console.log(arr[0].name); // David

В этом примере мы создаем новый объект newObj с тем же свойством name, но со значением 'David'. Затем мы заменяем элемент массива arr на новый объект. При выводе на консоль значение свойства name элемента массива arr изменяется на 'David', но значение свойства name оригинального объекта obj остается 'John'.

Надеюсь, это объясняет, почему изменение объекта не отражается в массиве, а также когда изменения могут быть отражены и когда нет.