[英]Explaination needed: Different outputs when used for…in and for(;;) in JavaScript
在NodeJS中,我創建了以下兩個腳本,它們都旨在從數組中刪除偶數。
這是我的第一個腳本:
#!/usr/bin/nodejs
var myarr = [2,3,5,1,6,2,28,5,7,90,3];
console.log(myarr);
for(var i in myarr){
if(myarr[i] % 2 == 0){
myarr.splice(i,1);
--i;
}
}
console.log(myarr);
第一個腳本的輸出如下:
[ 2, 3, 5, 1, 6, 2, 28, 5, 7, 90, 3 ]
[ 3, 5, 1, 2, 5, 7, 3 ]
在第二個腳本中,我將for..in
循環更改為for(;;)
循環,如下所示:
#!/usr/bin/nodejs
var myarr = [2,3,5,1,6,2,28,5,7,90,3];
console.log(myarr);
for(var i=0;i<myarr.length;i++){
if(myarr[i] % 2 == 0){
myarr.splice(i,1);
--i;
}
}
console.log(myarr);
我得到了第二個腳本的以下輸出:
[ 2, 3, 5, 1, 6, 2, 28, 5, 7, 90, 3 ]
[ 3, 5, 1, 5, 7, 3 ]
雖然我的意圖是相同的,但兩個for循環給了我不同的輸出。 我發現,在我的第一個腳本中,如果原始數組中存在兩個相鄰的偶數, if
條件似乎僅應用於跳過第二個偶數的第一個偶數。 如果有人能清楚地解釋這個差異,我真的很感激。
你做的是錯的。 您在循環遍歷同一陣列時從陣列中刪除鍵。 你的for...in
循環只會執行7次迭代,因為當數組仍在迭代時,你的4個鍵是從數組中拼接出來的,而你的for(;;)
循環將總是執行所有11次迭代,因為這是在開頭定義( myarr.length
)。
您應該定義第二個數組以用於結果:
對於在...
var myarr = [2,3,5,1,6,2,28,5,7,90,3],
resultarr = [];
console.log(myarr);
for(var i in myarr){
if(myarr[i] % 2 != 0){
resultarr.push(myarr[i])
}
}
console.log(resultarr);
-> [3, 5, 1, 5, 7, 3]
對於(;;)
var myarr = [2,3,5,1,6,2,28,5,7,90,3],
resultarr = [];
console.log(myarr);
for(var i=0;i<myarr.length;i++){
if(myarr[i] % 2 != 0){
resultarr.push(myarr[i]);
}
}
console.log(resultarr);
-> [3, 5, 1, 5, 7, 3]
作為結束注釋,您不應該使用for...in
循環來迭代數組。 這個答案詳述了為什么這是一個壞主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.