为什么循环结束时slug
array2
的值?
[[], [], [], [], []]
任何人都可以解释一下,这段代码中发生了什么吗?
答案 0 :(得分:4)
JavaScript中的数组是可变结构。每次将array1
分配给0
,length
就会被清空。在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);