【问题标题】:Why am I getting stuck in an infinite loop here? - Duplicating an array in Javascript为什么我在这里陷入无限循环? - 在 Javascript 中复制数组
【发布时间】:2016-03-02 20:01:07
【问题描述】:
function dupe(arr) {
  var arrNew = arr;
  for(i=0; i<arr.length; i++) {
    arrNew.push(arr[i]);
  }
  return arrNew;
}

dupe([1, 2, 3]);

在解决这个看似基本的问题时,我真的很难找出哪里出了问题。我想知道是否有人可以帮助我。

我的目标是输出 [1, 2, 3, 1, 2, 3] 但我却陷入了无限循环,因为我的初始数组的长度增加了。

我怎样才能使只有新数组被插入,而输入数组保持不变?

【问题讨论】:

    标签: javascript arrays loops duplicates


    【解决方案1】:

    发生的事情是 arrNew 引用的值与 arr 所引用的值相同(声明不会将 arr 的副本分配给 arrnew,因此当您迭代 @987654325 时@,你同时添加个新元素给它,所以它的长度总是大于i。

    为什么不做这样的事情呢?

    function dupe(arr) {return arr.concat(arr);}
    

    【讨论】:

    • 好的,谢谢。我隐约知道指针的概念(现在才刚刚开始编程),但不知道这就是这里发生的事情。分配其他类型的变量时会发生同样的事情吗? (谢谢,我在谷歌搜索该主题时发现了 concat 方法,但仍然需要确保我理解为什么这不是我认为的原因。
    • @NRMano 对。值得注意的是,javascript 中的数组是对象,对象是通过引用复制/比较的,因此声明只是为形参 arr 创建了一个新的本地 别名
    【解决方案2】:

    当你将一个数组赋值为一个值时,你会得到一个指向数组的指针,而不是数组的副本。所以你要追加到你正在迭代的同一个数组,这会导致一个无限循环。

    您可以自己检查它们是否相同:

    > var arr1 = [1, 2, 3];
    undefined
    > var arr2 = [1, 2, 3];
    undefined
    > var arr3 = arr1;
    undefined
    > arr1 === arr2;
    false
    > arr1 === arr3;
    true
    

    【讨论】:

      【解决方案3】:

      现在您正在将arr指针 传递给arrNew。 如果你改变其中一个,两者都会改变。

      使用var arrNew = arr.slice(0);
      arr副本 传递给arrNew 并解决问题。

      【讨论】:

        【解决方案4】:

        可以设置arrNew = arr.slice();,而不是设置arrNew = arr

        slice() 方法将数组的浅拷贝返回到新的数组对象中。

        这样 arrNew 和 arr 不会引用内存中的同一个对象。

        > arrNew = arr;
        > arrNew === arr // returns true
        
        > arrNew = arr.slice();
        > arrNew === arr // returns false
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-04-02
          • 2019-12-23
          • 2013-05-28
          • 2022-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多