Объект JavaScript, помещенный в массив

Возможный дубликат:
Как правильно клонировать объект JavaScript?

У меня есть этот код:

var temp = [];
var obj = {name:"1"};
temp.push(obj);
obj.name = "2";
temp.push(obj);

То, что я ожидаю быть правдой:

temp[0].name == "1" && temp[1].name == "2";

Что на самом деле происходит:

temp[0].name == "2" && temp[1].name == "2";

Почему это происходит, и как я могу получить то, что ожидаю?

Ответ 1

Массивы JavaScript содержат ссылки на объекты, а не сами объекты. Когда вы нажимаете объект в массив, он не создает новый объект, но он просто помещает ссылку на объект, который obj также указывает на, в массив.

Итак, в конце obj, temp [0] и temp 1 все указывают на один и тот же объект. Чтобы создать совершенно новый объект, вы можете использовать Object.create() или jQuery.extend({}, obj). Хотя в вашем случае достаточно просто создать новый простой объект, используя var newobj = {name="2"}

Ответ 2

Объекты JavaScript передаются по ссылке. В вашем случае у вас есть только один объект "obj", а temp [0] и temp [1] указывают на один и тот же объект.

Ответ 3

obj, являющийся объектом, добавляется ссылкой в ​​массив, поэтому вы фактически добавляете тот же самый obj дважды.