簡體   English   中英

需要說明:在JavaScript中使用... in和for(;;)時的輸出不同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM