2013-07-17 127 views
1

我想用幾個字符串做同樣的事情。我想這樣做:這個用法是否可以接受?

names = ["NOTE", "REPLICA", "HINT", "VIEW"]; 
for (name in names) { 
    name = names[name]; 
    //do stuff 
} 

然後我讀了this。它還好嗎?

+0

如果它在所有您想要使用它的環境中按預期工作,那麼就沒關係。 –

+1

關鍵在於:_「'for..in'遍歷對象的可枚舉屬性名稱,而不是數組的索引」_「。所以'for'循環更好。使用'for..in'來循環數組並不被認爲是好的做法。 – elclanrs

+0

我將通過模塊一起在未知環境中工作。 – Glycan

回答

1

這是更好地使用一些通過陣列走:

var i = 0; 
for(i=0;i<names.length;i++){ 
... 
} 

您鏈接到已經提到的文章,任何其他對象的屬性,包括東西上Array.prototype或Object.prototype中會for ... in另一露面不使用它的原因是因爲Array中的.. in比較慢。

那篇文章確實提到了一個邊緣情況,其中for ... in在數組長度較大時可能會更快,但只設置了幾個項目。在這種情況下,我想你可以使用for ... inhasOwnProperty和檢查,如果該屬性是一個數字:

var stuff, index; 
stuff = []; 
stuff[0] = "zero"; 
stuff[9999] = "nine thousand nine hundred and ninety-nine"; 
stuff.name = "foo"; 
for (index in stuff) 
{ 
    if (stuff.hasOwnProperty(index) && String(Number(index)) === index) { 
     console.log("stuff[" + index + "] = " + stuff[index]); 
    } 
} 
0

這比只使用一個for loop慢了許多。

約在86% slower在我的瀏覽器中(谷歌瀏覽器28.0.1500.72)。

看看這個benchmark我做了。
雖然for..in循環只跑在110,772 ops/sec(仍然快),for循環在791,792 ops/sec

跑到我通常使用for..in循環與objects。我相信這就是他們實際的目標。

+0

稀疏陣列可以更好地與for-in ... – dandavis

+0

每秒操作不是您應該查看的指標。 * for *循環將從0到* length *的每個整數迭代一次,對於每個可枚舉的屬性,a * for..in *循環只會迭代一次,這可能會減少數千個操作。 – RobG

相關問題