При копиране на масив в JavaScript в друг масив:
var arr1 = ['a','b','c'];
var arr2 = arr1;
arr2.push('d'); //Now, arr1 = ['a','b','c','d']
Разбрах, че arr2
се отнася до същия масив като arr1
, а не до нов, независим масив. Как мога да копирам масива, за да получа два независими масива?
Използвайте това:
var newArray = oldArray.slice();
По принцип операцията slice()
клонира масива и връща референция към нов масив.
За препратки, низове и числа (а не за действителния обект), slice()
копира препратките към обектите в новия масив. И оригиналният, и новият масив се отнасят към един и същ обект. Ако обектът, към който се препраща, се промени, промените са видими и в новия, и в оригиналния масив.
Примитиви като низове и числа са неизменни, така че промени в низа или числото са невъзможни.
Не е необходим jQuery... [Работен пример][1]
var arr2 = arr1.slice()
Това копира масива от началната позиция 0
до края на масива.
Важно е да се отбележи, че тя ще работи както се очаква за примитивни типове (низ, число и т.н.), а също така да се обясни очакваното поведение за референтни типове...
Ако имате масив от референтни типове, да речем от тип Object
. Масивът ще бъде копиран, но и двата масива ще съдържат препратки към едни и същи Object
's. Така че в този случай ще изглежда, че масивът е копиран по референция, въпреки че масивът всъщност е копиран.
Ако искате да създадете ново копие на обект или масив, трябва изрично да копирате свойствата на обекта или елементите на масива, например:
var arr1 = ['a','b','c'];
var arr2 = [];
for (var i=0; i < arr1.length; i++) {
arr2[i] = arr1[i];
}
Можете да потърсите повече информация в Google за неизменните примитивни стойности и променливите препратки към обекти.