javascript - angular.foreach 和原生 for 循环之间的性能差异

标签 javascript angularjs performance

我在我的应用程序中使用 native for 循环(下面的第三个循环语句),我读到的一些 native for 循环比 angular.forEach 具有更好的性能,但我没有找到正确的解释。如果有人有更好的解释请分享。

1) Angular .forEach

和 2)

for (var i = Things.length - 1; i >= 0; i--){
  Things[i]
};

和 3)

for (var i=0; i < Things.length; i++) {
  Things[i]
};

谢谢

最佳答案

使用 forEach 及相关

如果您使用的环境支持 ES5 的数组功能(直接或使用填充程序),则可以使用新的 forEach(规范 | MDN):

var a = ["a", "b", "c"];
a.forEach(function(entry) {
    console.log(entry);
});

forEach 接受一个迭代器函数,并且可以选择接受一个在调用该迭代器函数时用作 this 的值(上面未使用)。按顺序为数组中的每个条目调用迭代器函数,跳过稀疏数组中不存在的条目。虽然我上面只使用了一个参数,但迭代器函数是用三个参数调用的:每个条目的值、该条目的索引以及对您正在迭代的数组的引用(如果您的函数还没有它)方便)。

在通用网页上使用 forEach 仍然(截至 2014 年 3 月)需要为本身不支持它的浏览器添加一个“垫片”,因为 IE8 及更早版本没有它(并且全局浏览器用户中有 7% 到 21% 使用它们,具体取决于您相信的人;该数字因中国的使用率明显高于其他地方而略有偏差,请务必检查您自己的统计数据,看看您需要什么支持)。但是填充/填充它很容易完成(搜索“es5 shim”以获得多个选项)。

forEach 的优点是您不必在包含范围内声明索引和值变量,因为它们作为迭代函数的参数提供,并且很好地限定了该迭代的范围。

如果您担心为每个数组条目进行函数调用的运行时成本,请不要担心;详细信息。

此外,forEach 是“循环遍历所有”函数,但 ES5 定义了其他几个有用的“通过数组进行操作并执行操作”函数,包括:

every(迭代器第一次返回 false 或 false 时停止循环) some(迭代器第一次返回 true 或真实值时停止循环) filter(创建一个新数组,其中包含过滤函数返回 true 的元素并忽略返回 false 的元素) map(根据迭代器函数返回的值创建一个新数组) reduce(通过重复调用迭代器并传入先前的值来构建一个值;有关详细信息,请参阅规范;对于对数组的内容求和以及许多其他内容很有用) reduceRight(与reduce类似,但按降序而不是升序工作)

使用简单的 for 循环

有时旧的方法是最好的:

var index;
var a = ["a", "b", "c"];
for (index = 0; index < a.length; ++index) {
    console.log(a[index]);
}

如果数组的长度在循环期间不会改变,并且它是在性能敏感的代码中(不太可能),则预先获取长度的稍微复杂的版本可能会快一点:

var index, len;
var a = ["a", "b", "c"];
for (index = 0, len = a.length; index < len; ++index) {
    console.log(a[index]);
}

和/或倒数:

var index;
var a = ["a", "b", "c"];
for (index = a.length - 1; index >= 0; --index) {
    console.log(a[index]);
}

但是对于现代 JavaScript 引擎,您很少需要竭尽全力。

.forEach cannot be broken efficiently. You have to throw an exception to perform the break

所以原生循环比.each循环更好

关于javascript - angular.foreach 和原生 for 循环之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37937223/

相关文章:

javascript - 内部错误 : Invalid UTF-8 - Sass & Gulp

javascript - 使用 JQuery $(class).css() 停止 CSS webkit 动画?

javascript - 如何在 AngularJS 中为数组元素创建链接

CSS 性能

performance - Golang - 传递和返回变量的最佳实践

java - 延迟加载 Google Analytics Javascript 代码并在自己的服务器上托管 analytics.js

javascript - 为谷歌登录按钮使用自定义图像

javascript - 使用 jquery 访问脚本 block

javascript - 在 Ionic 应用程序上使用 $.getScript 加载 Google Map Api

javascript - Angularjs $http.post - 将参数作为 JSON 发送到 ASPX webmethod