2016-06-21 23 views
1

我在我的应用程序中使用native for循环(下面的第3个循环语句),我为循环读取的某些地方有比angular.forEach好的性能,但是我没有找到正确的解释。如果有人有更好的解释,请分享。angular.foreach和native for循环之间的差异

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] 
}; 

由于

回答

2

使用的forEach和相关

如果您使用的环境支持ES5的阵列功能(直接或使用垫片),则可以使用新的forEach(spec | MDN):

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

的forEach接受一个迭代函数和任选一个值,以调用该函数的迭代器(以上未使用)时,因为这使用。按顺序为数组中的每个条目调用迭代器函数,跳过稀疏数组中不存在的条目。尽管我只使用了上面的一个参数,但迭代器函数被三个参数调用:每个条目的值,该条目的索引以及对正在迭代的数组的引用(如果函数尚未拥有它便利)。

在通用网页上仍然使用forEach(截至2014年3月)要求您为本身不支持它的浏览器添加“填充”,因为IE8和更早版本没有它(全球浏览器用户的使用率在7%到21%之间,具体取决于你相信谁;这一数字在中国与其他地区的使用明显较高有关,总是检查你自己的统计数据,看看你需要什么支持)。但填补/填充它很容易完成(搜索“es5垫片”的几个选项)。

forEach具有这样的好处,您不必在包含范围中声明索引和值变量,因为它们作为迭代函数的参数提供,因此恰好适用于该迭代。

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

此外,的forEach就是“遍历所有这些”功能,但ES5定义了几个其他有用的“你的工作方式,通过阵列和做事”的功能,包括:

每一个(停止循环的第一次迭代器返回false或falsey) 一些(停止循环第一次迭代器返回true或truthy) filter(创建一个新的数组,其中包括过滤器函数返回true的元素并省略返回false的元素) map通过迭代器函数返回的值创建一个新数组) reduce(通过重复调用迭代器构建值,传递前一个值ES;详情请参阅规格;一个数组的内容和许多其他的东西) reduceRight总结有用(如降低,但在降,而不是升序)

使用一个简单的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不能被有效地打破。你必须抛出一个异常 进行突破

所以本地环比。每循环更好

相关问题