Зачем в цикле сохранять равные двум переменным? - PullRequest
0 голосов
/ 30 мая 2018

Почему цикл переводит значение переменной в другую переменную, которая была приравнена к той, которую цикл должен только изменить?

let arrr = [1,1,1,1,1];
let preArrr = [0,0,0,0,0];
preArrr = arrr;

  for (let i=0; i < arrr.length; i++) arrr[i] = i;

console.log(arrr, preArrr) // arrr = [0,1,2,3,4], preArrr = [0,1,2,3,4]

цикл forEach дает мне тот же результат

arrr.forEach(function(e, i) { arrr[i] = i })
console.log(arrr, preArrr) // arrr = [0,1,2,3,4], preArrr = [0,1,2,3,4]

, но если яизменить массив мгновенно, он не будет подключаться

let arrr = [1,1,1,1,1];
let preArrr = [0,0,0,0,0];
preArrr = arrr;

  arrr = [0,1,2,3,4]

console.log(arrr, preArrr) // arrr1 = [0,1,2,3,4], preArrr1 = [1,1,1,1,1];

так, как избежать этого подключения, но все еще использовать цикл?Я пытаюсь сохранить предыдущее состояние массива

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

я заметил, что метод slice () не предотвращает ссылку на тот же массив, если массив, который вы хотите скопировать, имеет 2 измерения

, чтобы избежать этого:

function slice2D(arr) {
  let store = [];
  for (let i = 0; i < arr.length; i++) {
    store.push(arr[i].slice());
  }
  return store;
}

let pasteArr = slice2D(copyArr);
0 голосов
/ 30 мая 2018

Поскольку вы изменили preArr, указав на тот же массив, что и arr

, который не делает копию, когда вы делаете preArr=arr.Вместо этого обе переменные являются ссылками на один и тот же массив

Если вы хотите скопировать оригинал в preArr, используйте Array#slice()

let arrr = [1, 1, 1, 1, 1];
let preArrr = arrr.slice();


for (let i = 0; i < arrr.length; i++) arrr[i] = i;

console.log('arrr', JSON.stringify(arrr))
console.log('preArrr', JSON.stringify(preArrr))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...