javascript '=' работает как связанный объект?

Я сделал код, который удаляет -1 в массиве, но я не хочу изменять исходный.

следующее это.

var original = [ 1, 2, 3, 4, -1, -1 ];
var temp = original;
for ( var i = ( temp.length - 1 ); i >= 0; i-- ) {
    if ( temp[j] == -1 ) {
    temp.splice( i, 1 );
}

после выполнения сценария. оригинал - [ 1, 2, 3, 4 ], а темп - [ 1, 2, 3, 4 ]

и оригинал, и темп модифицированы!

почему это?

4 ответа

Решение

Это потому, что существует только один массив - просто, обе переменные называют один и тот же массив. Точно так же как человек (с никами), у единственного объекта может быть много имен.

=Оператор (присваивания) в JavaScript не копирует / не клонирует / не дублирует назначаемый объект.

Array.splice Функция мутирует массив (из которого есть только один), который, когда он взят с вышеупомянутым, объясняет поведение.

Чтобы создать неглубокий клон массива, arr.slice(0) может быть полезным

Вы можете использовать метод фильтра массива, как это

var res = original.filter(function(i){ return i != -1;});

Это потому, что вы используете только один массив.

var temp = original;

Также стоит упомянуть, что оператор равенства = не копирует объект.

Вы можете попробовать что-то вроде этого, чтобы достичь того, что вы хотите:

var temp = original.slice(0);
var original = [ 1, 2, 3, 4, -1, -1 ];

var tem = original.filter(function (d) {
    return d !== -1;
});

console.log(original); // [1, 2, 3, 4, -1, -1] 
console.log(tem); // [1, 2, 3, 4] 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

демо: http://jsfiddle.net/J37tF/

Другие вопросы по тегам