Хорошо, прямо к делу, взгляните на этот код

Итак, что я хотел сделать, так это добавить к массиву музыкантов два объекта с двумя свойствами, оба с именем и возрастом Джона Майера и Чарли Пута. Так что я ожидал что-то вроде этого в качестве вывода:

Но посмотрите, каков фактический результат кода:

Да, кажется, что-то не так. Похоже, какая-то проблема при проталкивании объекта в массив музыкантов. Итак, давайте посмотрим, что находится внутри массива в каждом цикле.

Хм, что происходит? Первый цикл прошел нормально, имя и возраст Джона Майера помещаются в массив. Но после второго цикла в массиве есть правильное количество свойств, но оба они принадлежат Чарли.

Давайте запустим отладчик и посмотрим, что происходит с переменными на каждом шаге. Если вы не знакомы с отладчиком, строка, выделенная желтым цветом, — это следующая строка кода, которая будет выполняться, и все строки до ее выполнения.

Посмотрите, что происходит с объектом музыканта и массивом музыкантов.

Теперь у нас есть первое свойство Джона, помещенное в 0-й индекс массива музыкантов.

Когда музыкант. имя изменяется на «Чарли Пут», изменение отражается на объекте внутри массива музыкантов. То же самое произойдет и сmusic.age.

Когда значения свойства объекта музыканта изменяются, те же изменения происходят с объектом внутри массива. Как будто все отражается. 1-й индекс массива был дополнен значением Чарли, но 0-й индекс теперь также имеет те же значения. Итак, что здесь происходит?

Это связано с тем, что объекты JavaScript передаются по ссылке. Когда объект музыканта помещается в массив, на самом деле происходит передача или вталкивание ссылки на объект в массив. Таким образом, массив имеет два индекса, которые указывают/ссылаются на одно и то же место в памяти, которое является местоположением музыканта-объекта. Таким образом, каждое изменение, внесенное в объект музыканта, будет отражено как в 0-м, так и в 1-м индексах массива музыкантов.

Джон все еще грустит и злится на JavaScript. Так есть ли способ сделать его счастливым? Да, вот код.

Все, что нужно было сделать, — это переместить объявление объекта «музыкант» внутрь цикла for, чтобы ссылки на объекты, помещаемые в массив «музыканты», ссылались на разные адреса, так как объект «музыкант» повторно инициализируется в каждом цикле.

Ну вот и все, продолжай учиться!