Как известно переменная, которой присвоено значение в виде объекта или массива, на самом деле хранит только ссылку в область памяти, в которой храниться этот массив или объект.
Так же известно, что метод slice() для значения представленного в виде массива копирует часть этого массива (либо весь) в другую переменную, при этом переменные будут указывать на две разные области в памяти, т.е.
a = [1,2,3];
b = a.slice();
b[0] = 2;
alert(a); // [1,2,3]
alert(b); // [2,2,3]
Но стоит поместить в массив элементы, представляющие собой объекты, как такой способ перестает работать.
Пример:
a = [{x:1,y:1}];
b = a.slice();
b[0].x = 2;
alert(a); // [{x:2,y:1}]
alert(b); // [{x:2,y:1}]
Вопросы:
1. Почему так происходит?
2. Как в таком случае создать новую копию целевого массива, элементы которого представляют собой объекты?
Пробовал через цикл, таким образом:
var arr = [ {x:1, y:1} ];
var new_arr = [];
var new_arr_elem = {};
for (var i=0; i<arr.length; i++) {
arr_elem = arr[i];
for (var key in arr_elem) {
new_arr_elem = arr_elem[key];
}
new_arr.push(new_arr_elem);
}
Не могу сообразить почему это не работает (точнее работает не так как я это себе представляю) - натолкните на правильную мысль.