Соединение javascript - странная проблема

интересно, что с этим не так

$(function() {
var arr1=new Array('A','B','C','D','E','F','G');
var arr2=new Array('F','D','B');
var arr3=arr1;
    for(x=0; x<arr3.length; x++) {
        if(jQuery.inArray(arr3[x],arr2) == -1) {arr3.splice(x, 1);}

    }
    alert(arr1.join(','));
    alert(arr3.join(','));
});

Я думал, что arr1 по-прежнему должен быть Array('A','B','C','D','E','F','G'), но после этой операции arr1 становится arr3. Для меня это не имеет смысла, так как вся операция вообще не касается arr1.

Нашел ответ после публикации этого. См. раздел сращивание дублирующих массивов javascript.


person Vern    schedule 30.10.2011    source источник


Ответы (3)


Назначение типа var arr3=arr1; выполняется по ссылке, т.е. переменная arr3 теперь указывает на то же место, на которое указывает переменная arr1. Подчеркнутые данные (в данном случае массив) совпадают. По сути arr1 и arr3 одинаковы. Таким образом, любое изменение, сделанное через один, видно через другой. Если вы хотите продублировать массив простых типов, используйте slice(0)

var arr3 = arr1.slice(0);
person amit_g    schedule 30.10.2011

var x = [3, 4, 5]
var y = [3, 4, 5]
var z = y

x === y // false
y === z // true (y and z reference the same object)

y.push(6)
y // [3, 4, 5, 6]
z // [3, 4, 5, 6]

var x2 = x.slice(0)
x2 === x // false
x2.push('foo')
x2 // [3, 4, 5, 'foo']
x // [3, 4, 5]

Используйте Array.prototype.slice, чтобы скопировать массив.

person davidchambers    schedule 30.10.2011

arr1 — это объект массива. когда вы копируете arr1 как var arr3 = arr1, мы просто получаем новую ссылку на исходный объект. так что, когда вы меняете arr3, arr1 также меняется.

вам следует искать «как клонировать объект», это может вам помочь.

person Jin Huang    schedule 30.10.2011