Объект 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
дважды.