【问题标题】:Why loop keep equaling of two variables?为什么循环保持两个变量相等?
【发布时间】:2018-05-30 00:12:08
【问题描述】:

为什么循环将变量值转换为另一个变量,该变量等同于循环只应更改的变量?

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];

那么,如何避免这种连接,但仍然使用循环?我正在尝试保存数组的先前状态

【问题讨论】:

  • 你的代码没有意义,arrr1是什么?
  • preArrr = arrr; - preArrr 的原始内容现在无关紧要...您刚刚将preArrrarrr 设置为同一个数组... let preArrr = arrr.slice() 怎么样...现在值是相同的,但它不是同一个数组(注意,如果 arrr 的内容是对象,那么前面的语句不是很准确 - 但在这种情况下,你正在处理原始值,即1,而不是对象)
  • @mackenzie-craig 抱歉,当然应该有“arrr”
  • @jaromanda-x 我明白了,thanx man
  • arrr = [0,1,2,3,4] new 数组,preArrr = arrr;

标签: javascript loops for-loop foreach


【解决方案1】:

因为您将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))

【讨论】:

  • 可能需要注意的是,在上一期中,preArrr首先被改为指向同一个位置,后来arrr被改为指向另一个位置。
【解决方案2】:

我注意到 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多