javascript中forEach和for循环之间的区别

sac*_*024 22 javascript foreach loops for-loop

我想知道:是否有之间的任何显著差异forEachfor循环在JavaScript中.

考虑这个例子:

var myArray = [1,2,3,4];

myArray.forEach(function(value) {
  console.log(value);
});

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

以下是我研究的一部分:

  1. 性能:根据JsPerf:forEach比循环慢一点.
  2. 可用性:在forEach循环的情况下,我们无法从回调中断/返回.

例如:您想知道数字是否为素数.我认为使用for循环比使用forEach循环要容易得多.

  1. 可读性:使用for循环使代码比在代码中使用forEach更具可读性.
  2. 浏览器兼容性:IE中不支持forEach <9因此,我们的代码中引入了一些填充程序.

我的问题是:

  1. forEach over for循环有什么优势?
  2. 在什么情况下,forEach更可取.
  3. 为什么即使它进入JavaScript?为什么需要呢?

Lea*_*ema 18

forEachArray原型上的一种方法.它遍历数组的每个元素并将其传递给回调函数.

所以基本上,forEach是用例"将a的每个元素传递array给a function"的简写方法.这是一个常见的例子,我认为Array.forEachfor循环相比非常有用:

// shortcut for document.querySelectorAll
function $$(expr, con) {
    return Array.prototype.slice.call((con || document).querySelectorAll(expr));
}

// hide an element
function hide(el) {
    el.style.display = 'none';
}

// hide all divs via forEach
$$('div').forEach(hide); 

// hide all divs via for
for (var divs = $$('div'), i = 0; i < divs.length; i++) {
    hide(divs[i])
}
Run Code Online (Sandbox Code Playgroud)

如您所见,与for循环相比,forEach语句的可读性得到了改进.

另一方面,for语句更灵活:它不一定涉及数组.正常for循环的性能稍好一些,因为没有涉及每个元素的函数调用.尽管如此,建议for在将其作为forEach语句编写时避免循环.

  • 但差异在哪里?您只向forEach提供了信息 (2认同)

nai*_*sts 17

forEach循环中,您无法控制迭代数组的方式.经典的for循环允许您根据需要选择迭代算法(i++; i--; i+=2*i等).

但是,forEach循环更容易使用 - 您不需要乱用所有i计数,找到array[i]对象 - JS为您完成.


Phi*_*l H 9

>> sparseArray = [1, 2, , 4];

>> sparseArray.forEach(console.log, console);
1 0 [1, 2, 3: 4] 
2 1 [1, 2, 3: 4] 
4 3 [1, 2, 3: 4] 

>> for(var i = 0; i < sparseArray.length; ++i) { console.log(sparseArray[i]) };
1
2
undefined
4 
Run Code Online (Sandbox Code Playgroud)

forEach最近在javascript中使表达式列表理解风格成为可能.在这里你可以看到forEach 跳过从未设置的元素,但是你可以用for循环做的最好的是检查undefined或者null,这两个元素都可以被设置为值并被拾取forEach.除非您期望缺少值,否则forEach相当于for循环,但请注意您无法提前停止,这是您需要的every.