为什么将一个空数组推入另一个数组?

时间:2018-08-20 18:19:48

标签: javascript arrays loops

为什么循环结束时slug array2的值?

[[], [], [], [], []]

任何人都可以解释一下,这段代码中发生了什么吗?

4 个答案:

答案 0 :(得分:4)

JavaScript中的数组是可变结构。每次将array1分配给0length就会被清空。在1到10之间只有5个偶数(即:2、4、6、8、10),因此array2中有5个对array1的引用。

答案 1 :(得分:1)

这是因为array1.length = 0;

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

因此从技术上讲,您要为迭代中的每个偶数推新的空数组。

答案 2 :(得分:1)

其他答案已经解释了发生了什么,这是获得您期望的方法:

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新功能,该功能将创建要应用的数组的浅表副本。

答案 3 :(得分:1)

因为当您推送数组/对象变量时,您存储的是引用而不是值。如您所知,要删除array1值,使array1的长度等于0,这将导致您看到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);