Переменная Javascript в функции изменяет глобальную переменную

у меня огромная проблема с определением областей и пунктов. Я хочу иметь переменную tmp, из которой я удаляю один элемент. Но глобальная переменная должна остаться нетронутой. Это то, что я придумал. Этот;

var test = ['test', 'huhu'];

function foo(bar) {

    var tmpTest = test;
    var index = tmpTest.indexOf(bar);

    if (index > -1) {
        tmpTest.splice(index, 1);
    }
    console.log(tmpTest);
}

foo('huhu');
console.log(test);

Должен произвести это;

test
test, huhu

Но производит это;

test
test

Я тоже пытался сделать var tmpTest = new Array(test); Но это останавливает работу сплайсинга. Я думаю, что происходит, когда я устанавливаю tmpTest = test, tmpTest просто становится ссылкой на исходную переменную test? Как я могу обойти это?


person jakobS    schedule 04.04.2017    source источник
comment
Объекты (включая массивы) передаются с использованием их ссылок! Таким образом, и tmpTest, и test ссылаются на один и тот же массив (пространство в памяти)! Вы должны скопировать массив другим способом, например: var tmpTest = test.slice();!   -  person ibrahim mahrir    schedule 04.04.2017
comment
FWIW, проблема не имеет ничего общего с масштабом.   -  person Felix Kling    schedule 04.04.2017


Ответы (1)


Массивы — это объекты. Объекты в JavaScript управляются ссылками. Присвоение ссылки не требует создания копии объекта; это просто копия ссылки. Таким образом, ваша переменная tmpTest — это просто еще одна ссылка на тот же объект.

Есть простой способ сделать копию массива:

  var tmpTest = test.slice(0);

Это создает новый массив со всеми теми же значениями, что и исходный.

Конструктор Array() можно вызвать с одним или несколькими аргументами, но эти аргументы не интерпретируются как массив для создания копии. Если он вызывается с одним числовым аргументом, он интерпретируется как начальное значение .length для массива. Более одного аргумента создает новый массив с этими значениями.

person Pointy    schedule 04.04.2017