Почему изменения, вносимые в объект, не отражаются на его представлении в массиве?

Почему значение элемента в массиве, содержащего объект, не изменяется, когда изменяется сам объект? Почему вывод console.log(arrq[0]) не является null?
  • 25 октября 2023 г. 9:49
Ответы на вопрос 2
Изменения, вносимые в объект, не отражаются на его представлении в массиве из-за свойств копирования и ссылочных типов данных в JavaScript.

Когда объект добавляется в массив, в массиве сохраняется ссылка на этот объект, а не сам объект. Поэтому, когда вносятся изменения в сам объект (изменение его свойств), эти изменения видны в любом месте, где используется ссылка на этот объект.

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

Вот почему значение элемента в массиве, содержащего объект, не изменяется, когда изменяется сам объект. Вывод console.log(arrq[0]) не является null, потому что arrq[0] по-прежнему ссылается на оригинальный объект, а не на измененный объект.

Пример:

```javascript
let obj = { value: "old" };
let arrq = [obj];

console.log(arrq[0]); // { value: "old" }

obj.value = "new";

console.log(arrq[0]); // { value: "new" }

obj = { value: "updated" };

console.log(arrq[0]); // { value: "new" }, а не null
```

В последнем console.log(arrq[0]) выводится { value: "new" }, а не null, потому что объект с ссылкой obj был заменен на новый объект, но в массиве arrq все еще остается ссылка на старый объект.
Объекты присваиваются по ссылке, а не по значению. Можно сравнить это с наклеиванием двух ярлыков на коробку и потом отрыванием одного из них. Второй ярлык и сама коробка останутся неизменными.

Для проведения экспериментов можно изменить свойство объекта, например obj.name = "asd", чтобы изменить объект в массиве arr. Переменная obj содержит не сам объект, а ссылку на него, так же как и ссылка на него помещается в arr[0]. Если никто не сохранит ссылку на объект, то он будет автоматически удален.

К сожалению, в JavaScript не хватает некоторых возможностей для более полного контроля над объектами. Иногда это может вызывать некоторое неудовлетворение. Но с другой стороны, это также снижает риск случайных ошибок.
Похожие вопросы