В 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'
.
Надеюсь, это объясняет, почему изменение объекта не отражается в массиве, а также когда изменения могут быть отражены и когда нет.