代码片段 → JavaScript → 循环遍历数组避免不必要的查找 循环遍历数组避免不必要的查找 Chris Coyier 于 2009年11月30日 在 for 函数中使用数组长度 **之前** 先获取数组长度,这样它就不需要在每次迭代中都计算数组长度(假设长度在循环过程中不会改变)。 var arLen=myArray.length; for ( var i=0, len=arLen; i<len; i++ ){ // do something with myArray[i] }
虽然您说的加快速度是正确的,但这并不是因为另一种方法每次都需要计算长度。对于像 Java 这样的语言,数组对象上的 length/size/count 方法实际上是一个 *方法*(它可能执行一些计算来确定大小),那么以您描述的方式缓存大小会更好。
这样做的速度 **略微** 更快的原因是,浏览器每次获取其长度时都需要取消对数组对象的引用,而不是重新计算长度。
此外,如果您想在这里进行另一个 **非常细微的** 改进,您可以执行以下操作
for (var i = 0, len=myArray.length; i < len; ++i) {
// 循环
}
这里关键是使用
++i
而不是i++
。为什么这样更快?
后增量运算符 (i++) 首先返回 i 的当前值,然后将其加 1。前增量运算符 (++i) 首先将值加 1,然后返回值。
如您所见,编译器需要将 i 的先前状态作为 i++ 的返回值保留,而对于 ++i,它返回增量后的状态。不过,差异确实微乎其微,但嘿,我们节省了一个原本浪费的查找。;-)
另一个可能有助于加快速度的小技巧是,如果可能,倒数到零,因为与零进行比较比进行“小于”(从根本上来说是减法,然后与零进行比较)更快。
我还想建议一件事,为什么您使用另一个变量 len 来存储数组长度的值
len=arLen
为什么不直接
var arLen=myArray.length;
for ( var i=0; i<arLen; i++ ){
// 对 myArray[i] 执行某些操作
}
对于一个简单的循环结构,这些观点非常有趣 :) 确实非常概念化..喜欢这些评论!
嗨,您绝对正确。我想遍历数组值并应用 CSS,您能否告诉我?
为什么不抛弃这两个变量并进一步简化测试条件?
而不是
len=arLen
或
var arLen=myArray.length;
如何使用这个
var i = myArray.length;
while (i–) {
// 对 myArray[i] 执行某些操作
};
这是关于此主题的基准测试 http://jsperf.com/for-loop-research
我认为我们可以进一步优化它。根据我的理解,arLen 应该为 iLen。arLen 指的是如果这是一个数组类型变量,但它是一个整数变量。我们始终遵循关于未来代码维护的最佳变量命名约定。