[英]Why does the array push an empty array into another?
為什么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);
任何人都可以解釋一下,這段代碼中發生了什么?
JavaScript中的數組是可變結構。 通過將0
分配給length
,每次都會清空array1
。 在1和10之間只有5個偶數(即: array2
),因此array2
有5個對array1
引用。
這是因為array1.length = 0;
。
您指向相同的數組引用並將其設置為空。
所以從技術上講,你在迭代中為每個偶數推送一個新的空數組。
其他答案已經解釋了發生了什么,這里是做什么來達到你的期望:
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);
您可以簡單地使用名為array destructuring [...arr]
的新ECMAScript功能(解構為新數組),該功能會創建應用它的數組的淺表副本。
因為當您按下數組/對象變量時,您將存儲引用,而不是值。 使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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.