【问题标题】:Why does the array push an empty array into another?为什么数组会将一个空数组推入另一个数组?
【发布时间】:2018-08-20 18:19:47
【问题描述】:

为什么array2[[], [], [], [], []]的值在循环的末尾?

var array1 = [];
var array2 = [];

for (let i = 1; i <= 10; i++) {
  array1.push(i);
  if (i % 2 === 0) {
    //console.log(array1);
    array2.push(array1);
    array1.length = 0;
  };
};
console.log(array1);
console.log(array2);

谁能解释一下,这段代码发生了什么?

【问题讨论】:

  • 您的代码将array1.length 显式设置为零。将数组推入另一个数组不会复制。

标签: javascript arrays loops


【解决方案1】:

JavaScript 中的数组是可变结构。通过将0 分配给lengtharray1 每次都会被清空。 1到10之间只有5个偶数(即:2、4、6、8、10),所以array2里面有5个array1的引用。

【讨论】:

    【解决方案2】:

    因为array1.length = 0;

    您指向相同的数组引用并将其设置为空。

    所以从技术上讲,您正在为迭代中的每个偶数推送一个新的空数组。

    【讨论】:

      【解决方案3】:

      其他答案已经解释了发生了什么,以下是获得预期结果的方法:

      var array1 = [];
      var array2 = [];
      
      for (let i = 1; i <= 10; i++) {
        array1.push(i);
        if (i % 2 === 0) {
          //console.log(array1);
          array2.push([...array1]);
          array1.length = 0;
        };
      };
      console.log(array1);
      console.log(array2);

      您可以简单地使用名为 数组解构 [...arr](解构为新数组)的新 ECMAScript 功能,它会创建应用它的数组的浅表副本。

      【讨论】:

      • 非常感谢,我其实也想知道怎样才能得到想要的结果。
      【解决方案4】:

      因为当你推送一个数组/对象变量时,你存储的是引用,而不是值。使 array1 长度等于 0,因为您知道您正在删除 array1 值,这会导致您看到 array2 的结果。

      如果你想拥有你期望的行为,你可以在每次推送之前创建一个新数组,例如:

      var array1 = [];
      var array2 = [];
      
      for (let i = 1; i <= 10; i++) {
        array1.push(i);
        if (i % 2 === 0) {
          array2.push(Array.from(array1));
          array1.length = 0;
        };
      };
      // []
      console.log(array1);
      // [ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ], [ 9, 10 ] ]
      console.log(array2);
      

      【讨论】:

        猜你喜欢
        • 2022-01-03
        • 2015-07-26
        • 1970-01-01
        • 2013-01-14
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多