angular.foreach和native for loop

时间:2016-06-21 06:42:39

标签: javascript angularjs performance

我在我的应用程序中使用native for循环(下面的第3个循环语句),有些我读取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]
};

由于

1 个答案:

答案 0 :(得分:3)

使用forEach及相关

如果您正在使用支持ES5阵列功能的环境(直接或使用填充程序),则可以使用新的forEach(spec | MDN):

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

forEach接受迭代器函数,并且可选地,在调用迭代器函数时使用的值(上面未使用)。为数组中的每个条目调用迭代器函数,按顺序跳过稀疏数组中不存在的条目。虽然我上面只使用了一个参数,但迭代器函数被调用三个:每个条目的值,该条目的索引,以及对你要迭代的数组的引用(如果你的函数没有&#39;已经很方便了。)

在通用网页上使用forEach仍然(截至2014年3月)要求您包含一个&#34; shim&#34;对于那些本身不支持它的浏览器,因为IE8和更早版本没有它(并且它们被全球浏览器用户的7%到21%之间的某些地方使用,具体取决于你是谁相信;这个数字在中国与其他地方的使用率显着上升有所偏差,总是检查你自己的统计数据,看看你需要支持什么。但是填充/填充它很容易(搜索&#34; es5垫片&#34;有几个选项)。

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

如果您担心为每个阵列条目调用函数的运行时成本,请不要这样做;的信息。

此外,forEach是&#34;循环遍历所有&#34;功能,但ES5定义了其他几个有用的&#34;通过数组工作并做事情&#34;功能,包括:

every(在第一次迭代器返回false或falsey时停止循环) 一些(第一次迭代器返回true或者truthy时停止循环) filter(创建一个新数组,包括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无法有效破解。你必须抛出异常   执行休息

因此,原生循环优于.each循环