jQuery eq()导致无限迭代

时间:2016-05-10 21:06:49

标签: javascript jquery loops iteration

当我尝试在我的代码中总结一下时,我发现我写这样的东西:

var $elements = $('div');
for ( var i = 0, $element; $element = $elements.eq(i); i++ ) {
    $element.text( 'Hello' );
}

循环永远不会结束。我想知道,为什么会这样。如果我在条件内调用函数或者jQuery没有返回准确的数据会导致错误,因此循环条件无法识别当前索引?

2 个答案:

答案 0 :(得分:3)

.eq()方法总是返回一个jQuery对象。如果指定的索引不存在,则会得到一个空的jQuery对象。但是任何对象都是真实的,所以即使在i经过最后一个元素之后,你的循环条件也总是真实的。所以,无限循环。

您需要测试长度:

for ( var i = 0, $element; i < $elements.length && ($element = $elements.eq(i)) ; i++ )

但为什么不使用.each()方法循环?

将当前元素指定为循环条件的模式适用于数组:

for ( var i = 0, element; element = anArray[i]; i++ ) 

假设没有任何元素具有falsey值,因为当i到达an array.length时,anArray[i]将为undefined,这是假的。

答案 1 :(得分:0)

因为$而且$elements.eq将始终返回一个对象,即使没有任何内容与查询匹配。该对象的长度为0但它仍然是一个对象。对象是真实的价值观。

&#13;
&#13;
function log(msg) {
  document.querySelector('pre').innerText += msg + '\n';
}

log($('p').eq(0)); // First p element
log($('p').eq(1)); // Second p element
log($('p').eq(2)); // Third p element
log($('p').eq(3)); // No matching p element but look at what we get

if ($('p').eq(9001)) {
  log('Yup, still a truthy value');
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<p>1</p>
<p>2</p>
<p>3</p>

<pre></pre>
&#13;
&#13;
&#13;