455

我正在尝试遍历一组元素。jQuery 的文档说:

jquery.Each() 文档

返回非 false 与 for 循环中的 continue 语句相同,它将立即跳到下一次迭代。

我试过调用'return non-false;' 和“非假”;(无返回)两者都不会跳到下一次迭代。相反,他们打破了循环。我错过了什么?

4

6 回答 6

814

他们所说的非假的意思是:

return true;

所以这段代码:

var arr = ["one", "two", "three", "four", "five"];
$.each(arr, function(i) {
  if (arr[i] == 'three') {
    return true;
  }
  console.log(arr[i]);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

将记录one, two, four, five.

于 2009-01-26T22:16:07.100 回答
62

通过'return non-false',他们的意思是返回任何不适合布尔假的值。所以你可以返回true, 1, 'non-false', 或者任何你能想到的东西。

于 2009-01-26T22:18:50.060 回答
5

Javascript 有点“真实”和“虚假”的概念。如果一个变量有一个值,那么通常是 9,如您所见)它具有“真实性” - 空值,或者没有值倾向于“虚假性”。下面的片段可能会有所帮助:

var temp1; 
if ( temp1 )...  // false

var temp2 = true;
if ( temp2 )...  // true

var temp3 = "";
if ( temp3 ).... // false

var temp4 = "hello world";
if ( temp4 )...  // true

希望这有帮助吗?

此外,值得一试 Douglas Crockford 的这些视频

更新:感谢@cphpython 发现损坏的链接 - 我现在已经更新指向工作版本

Javascript 语言

Javascript - 好的部分

于 2009-01-26T23:27:09.983 回答
4

不要忘记,有时您可能会从块的末尾掉下来进行下一次迭代:

$(".row").each( function() {
    if ( ! leaveTheLoop ) {
        ... do stuff here ...
    }
});

而不是像这样实际返回:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});
于 2013-07-30T16:26:13.630 回答
3

仅当您按字面返回时,循环才会false中断。前任:

// this is how jquery calls your function
// notice hard comparison (===) against false
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
   break;
}

这意味着您可以返回任何其他内容,包括undefined,如果您不返回任何内容,则返回该内容,因此您可以简单地使用一个空的 return 语句:

$.each(collection, function (index, item) {
   if (!someTestCondition)
      return; // go to next iteration

   // otherwise do something
});

这可能因版本而异;这适用于 jquery 1.12.4。但实际上,当您退出函数的底部时,您也没有返回任何内容,这就是循环继续进行的原因,所以我希望没有任何返回内容无法继续循环的可能性。除非他们想强迫每个人都开始返回一些东西来保持循环,否则什么都不返回必须是保持循环一种方式。

于 2016-09-23T21:44:45.200 回答
-3

jQuery.noop()可以提供帮助

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});
于 2016-08-22T10:13:08.627 回答