2010-12-07 54 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 ++)构造(长度只计算数组中的元素)