2012-04-04 56 views
1

我有以下对象:JavaScript的for ... in循环是有奇怪的结果

var r = { 
    obj: $(this), 
    children: $(this).children(), 
    panes: $('.rotatorPane', $(this)), 
    tagNames : [], 
    captions: [], 
    subcaptions: []  
}; 

$(this)是指以下DIV:

<div class="myRotator"> 
    <div class="rotatorPane"> 

    </div> 
    <div class="rotatorPane" id="pane3"> 

    </div> 

    <img src="img/1.jpg" alt="pane 1" class="rotatorPane" data-caption="Lorem Ipsum" data-subcaption="Dolor sit amet" /> 

</div> 

我遇到的问题是与以下用于... in循环:

for(pane in r.panes){ 
    console.log(pane); 
} 

输出按预期开始:

0 
1 
2 

但后来我得到了一堆的方法名称为输出:

length 
prevObject 
context 
selector 
constructor 
init 
jquery 
size 
toArray 
get 
...etc 

有谁知道为什么发生这种情况?

回答

8

不要在数组或类似数组的东西上使用for ... in。使用数字索引变量。

for (var i = 0; i < r.panes.length; ++i) { 
    var pane = r.panes[i]; 
    // ... 
} 

for ... in的形式是用于遍历对象— 所有这些的属性。当你想遍历一个数组的索引属性(或者,再次,你认为是一个数组)时,总是使用数字索引。

在这种情况下,所讨论的类似数组的对象是一个jQuery对象,除了数字索引属性外,它还具有各种属性。

+1

'为in'只能检索所有的键时使用一个东西。对于其原型尚未修改的简单数组,除了迭代顺序不能保证(特别是如果将项插入数组中间),大多数情况下都可以工作,所以您应该永远不要使用它。 – 2012-04-04 19:11:08

+1

嗯,是的,但是我个人试图回避那些“总是有效”的编码实践,当有一个简单的替代方法* always *时。此外,对于某些代码,您永远不知道其环境可能会发生何种变化,以便Array原型获得一些额外的可迭代属性。是的,有'hasOwnProperty()'测试,但如果你不得不去处理所有的麻烦,那看起来没有意义。 – Pointy 2012-04-04 19:14:14

+0

如果你阅读我的评论,你会发现我的观点是即使有一种方法可行,但你仍然不应该使用它。 – 2012-04-04 19:20:40

1

你应该使用jQuery的每个循环,我认为,因为你可能不能使用hasOwnProperty由于jQuery的增加它自己的方法和材料的对象