在JavaScript中执行循环的最佳方法是什么?

And*_*sen 29 javascript macros jquery loops

我偶然发现了几种在JavaScript中循环的方法,我最喜欢的是:

for(var i = 0; i < a.length; i++){
    var element = a[i];
}
Run Code Online (Sandbox Code Playgroud)

但是在这里进行了测试(http://www.robertnyman.com/2008/04/11/javascript-loop-performance/),应该编写它以便只计算一次长度.

在jQuery中有一个.each,你可以坚持一个功能.我喜欢这个更好一点,因为我不需要输入两次数组,就像上面的解决方案一样.

如果JavaScript支持宏,那么推出自己的宏将是件小事,但遗憾的是它没有.

那么你们用什么?

Ash*_*Ash 37

我已经开始使用相关的迭代器.性能是合理的,但更重要的是它允许您封装循环逻辑:

function createIterator(x) {
    var i = 0;

     return function(){
       return x[i++];
    };
}
Run Code Online (Sandbox Code Playgroud)

然后使用:

var iterator=createIterator(['a','b','c','d','e','f','g']);

iterator();
Run Code Online (Sandbox Code Playgroud)

返回"a";

iterator();
Run Code Online (Sandbox Code Playgroud)

返回"b";

等等.

迭代整个列表并显示每个项目:

var current;

while(current=iterator())
{
    console.log(current);
}

请注意,上述内容仅适用于迭代包含"非虚假"值的列表.如果此数组包含以下任何一个:

  • 0
  • ""
  • 空值
  • 为NaN

上一个循环将停止在该项目,而不是总是你想要/期望的.

为避免这种用途:

var current;

while((current=iterator())!==undefined)
{
   console.log(current);
}
Run Code Online (Sandbox Code Playgroud)

  • 对不起,我想我有点习惯使用那些在你尝试访问数组末尾时尝试编写依赖于JS不会在你尝试做这个. (2认同)

Cha*_*ert 10

对原始的小改进,只计算一次数组大小:

for(var i = 0, len = a.length; i < len; i++){ var element = a[i]; }
Run Code Online (Sandbox Code Playgroud)

另外,我看到很多for..in循环.虽然请记住它在技术上不是犹太洁食,并且会特别引起Prototype的问题:

for (i in a) { var element = a[i]; }
Run Code Online (Sandbox Code Playgroud)

  • for..in循环用于遍历对象属性,尽管它们似乎适用于数组,但它们还将遍历'length'属性或任何其他动态添加的属性。这就是为什么它不能与原型一起很好地工作的原因。 (2认同)

Ran*_*ku' 6

首先将长度存储在变量中.

  var len = a.length;
  for (var i = 0; i < len; i++) {
    var element = a[i];
  }
Run Code Online (Sandbox Code Playgroud)


Rem*_*arp 6

我知道我迟到了,但我使用反向循环来进行不依赖于顺序的循环.

与@Mr非常相似.麝香鼠 - 但简化了测试:

var i = a.length, element = null;
while (i--) {
  element = a[i];
}
Run Code Online (Sandbox Code Playgroud)