Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该什么时候使用forEach?_Javascript_For Loop_Foreach - Fatal编程技术网

Javascript 我应该什么时候使用forEach?

Javascript 我应该什么时候使用forEach?,javascript,for-loop,foreach,Javascript,For Loop,Foreach,我可以 var arr = []; arr.forEach(function(i) { i; }); for (var i = 0, length = arr.length; i < length; ++i) { arr[i]; } var arr=[]; arr.forEach(功能(i){ 我 }); 对于(变量i=0,长度=arr.length;i

我可以

var arr = [];

arr.forEach(function(i) {

     i;
});

for (var i = 0, length = arr.length; i < length; ++i) {

     arr[i];
}
var arr=[];
arr.forEach(功能(i){
我
});
对于(变量i=0,长度=arr.length;i

什么时候我应该使用一个而不是另一个,性能有差异吗?

您可以在任何时候使用foreach:

  • 数组是关联的或有间隙,即不能通过递增的数字(1,2,5,'x',-7)到达每个元素
  • 您需要按照它们在数组中出现的顺序进行迭代。(例如2,1,3)
  • 你要确保不要陷入无休止的循环
最后一点是主要区别:foreach工作在一个副本上,因此即使您更改了元素,数组仍然保持不变,并且可以无缺陷地迭代

该副本使foreach比for稍慢一些,因为它必须复制数据。请记住,一些古老或罕见的浏览器不支持foreach,但它们确实支持“for”。除非你的阵型真的很大(超过10.000个),否则忽略速度差。以毫秒为单位

您在任何时候使用

  • 您需要一种简单的方法来调整正在移动的阵列
  • 您需要特定的序列,例如($i=100;$i<1000;$i+=5)导致100105110

forEach
速度较慢,但它会为每次迭代创建一个范围,您必须手动为
创建一个正常的
(如果需要)…并允许您在回调中设置
this
的值(及其第二个参数)。并非所有浏览器都支持它:
forEach
也不会在空项上循环。阅读更多信息:-它包括一个适用于不支持它的浏览器的polyfill。这部分回答了您的问题:要回答性能问题,请在阵列中使用50000个值创建一个性能测试。或者执行50000个循环。
forEach
是ECMAScript 5->compatibility@Tim我看到一个代码段有实时输出,而另一个没有——这可能会改变迭代所需的时间。你知道——它们是谎言,该死的谎言,还有基准我已经建立了一个游戏引擎,并且正在努力提高每一点速度。我想将它们改为for循环是一件好事,因为它更快,使我的引擎更兼容,对吗?@user2251919如果您的数组是无间隙编号的,并且您知道如何避免意外的无止境循环,是的。无论如何,不要高估差异。:)好的,谢谢,我会记住这一点,我想我现在就不谈了,但要知道这仍然是件好事:)“你的数组是关联的”:你不应该对数组使用非数值属性。它们不会被视为数组元素,即使是
forEach
。也不考虑负指数。“foreach在副本上工作”:这是不正确的(或者至少是一个实现细节)。只有元素的范围是固定的。如果在对数组进行迭代之前修改该数组的值,则回调将获取新值。看见你从哪里得到它在副本上工作的信息?“你需要以与它们在数组中出现的顺序完全相同的顺序进行迭代”你也可以使用
for
循环。总的来说,我认为你的回答包含了一些不准确的信息,特别是关于复制的事情。规范非常清楚如何处理修改。