当我尝试在我的代码中总结一下时,我发现我写这样的东西:
var $elements = $('div');
for ( var i = 0, $element; $element = $elements.eq(i); i++ ) {
$element.text( 'Hello' );
}
循环永远不会结束。我想知道,为什么会这样。如果我在条件内调用函数或者jQuery没有返回准确的数据会导致错误,因此循环条件无法识别当前索引?
答案 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但它仍然是一个对象。对象是真实的价值观。
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;