JS:循环遍历数组(for ... in)

时间:2010-12-07 07:00:49

标签: javascript arrays for-loop

为什么我这样做

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; },function Array(){[native code]},function pop(){[native code]},function push(){[native code]},function reverse(){[native code]},function shift() {[native code]},function sort(){[native code]},function splice(){[native code]},function unshift()

为什么?什么功能等...我觉得它工作正常b4,我不知道是什么导致了这一点,对于我尝试的所有浏览器似乎都一样。 Firefox 3.6,Chrome 6(我认为?),IE9

4 个答案:

答案 0 :(得分:6)

for(var in obj)用于迭代对象的属性。您将获得已创建的Array对象的属性。

您需要更传统的循环/索引构造:

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

某些JavaScript运行时在Array对象上也有mapreduce方法,但这不能保证。但是,大多数JavaScript库都有这样的东西(或者可能是each方法)。

答案 1 :(得分:1)

在javascript中,

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

不只是迭代a和b;它还迭代该对象原型的所有成员。因为函数是javascript中的值,包括Object的所有方法。有三种方法可以避免这种情况:

  1. 在使用k
  2. 之前检查obj.hasOwnProperty(k)
  3. 如果您正在迭代数组,请使用数组的forEach方法(或您喜欢的javascript库中的等效方法)
  4. 如果要迭代数组,请使用for(var i = 0; i&lt; obj.length; i ++)构造(长度仅计算数组的元素)

答案 2 :(得分:0)

for/in循环不能用于遍历数组,因为它还枚举了用户定义的属性(请参阅MDC documentation)。对于数组对象和forEach循环有一个for each/in方法,但仅限于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) });

答案 3 :(得分:0)

Weston C回答的替代方法是使用hasOwnProperty循环中的for in函数,如Chris Morgan所示:

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

是的,它比使用传统的for循环迭代要慢。