2010-12-07 98 views
1

爲什麼ISIT當我做JS:通過數組(...的)循環

http://jsfiddle.net/xe4Ph/1/

var footnoteLinks = [1,2,3]; 
for (var i in footnoteLinks) { 
    document.write(footnoteLinks[i] + ", "); 
} 

我所得到的是一樣的東西......

1,2 ,3,function(){return lower; }函數Array(){[native code]},function pop(){[native code]},function push(){[native code]},function reverse(){[native code]},function shift()函數splice(){[native code]},函數unshift()

這是爲什麼?什麼與功能等...我認爲它工作得很好b4,我不知道是什麼造成了這一點,這似乎是我嘗試過的所有瀏覽器。 Firefox 3.6,Chrome 6(我認爲?),IE9

+2

查看相關的問題。如果沒有`hasOwnProperty`檢查,使用`for .. in`並不安全,並且舊式循環比`in .. in .. hasOwnProperty`快得多。 – 2010-12-07 07:11:21

+0

[JavaScript:循環數組]的可能重複(http://stackoverflow.com/questions/3908902/javascript-looping-over-array) – 2010-12-07 07:35:08

回答

6

for(var in obj)用於迭代對象的屬性。你正在獲得你創建的Array對象的屬性。

你想要一個更傳統的循環/索引結構:

for(var i=0,z=footnoteLinks.length; i<z; i++) 

一些JavaScript運行時也對Array對象mapreduce方法,但不能保證這一點。雖然大多數JavaScript庫都有類似的東西(或者可能是each方法)。

0

for/in循環不能用於迭代數組,因爲它還枚舉了用戶定義的屬性(請參見MDC documentation)。在數組對象和for each/in循環中有一個forEach方法,但只在JavaScript 1.6+(=現在沒有多大用處)。您可能需要使用一些很多JavaScript框架或編寫自己的效用函數來遍歷數組:

function iterate(a, func) { 
    for (var i=0; i<a.length; i++) 
     func(a[i]); 
} 

iterate([1, 2], function(x) { console.log(x) }); 
0

的替代Weston C的答案將使用在for in循環的hasOwnProperty功能,如建議Chris Morgan

for(var i in obj) if(obj.hasOwnProperty(i)) { 
    document.write(obj[i]); 
} 

是的,它是不是使用傳統的for迭代循環慢。

1

在JavaScript中,

for (var k in {a:1, b:2}) { 

並不僅僅遍歷a和b;它也遍歷該對象原型的所有成員。由於函數是javascript中的值,它包含Object的所有方法。有三種方法來避免這種情況:

  1. 檢查obj.hasOwnProperty(K)您使用k
  2. 之前,如果你遍歷數組,數組使用中你最喜歡在foreach方法(或同等學歷JavaScript庫)
  3. 如果你正在迭代一個數組,使用for(var i = 0; i < obj。長度; i ++)構造(長度只計算數組中的元素)