我已经整理了一个jsperf测试,该测试比较迭代数组的循环,缓存数组长度条件而非缓存。我认为之前缓存变量以避免重新计算数组长度每次迭代会更快,但jsperf测试说不然。有人可以解释为什么会这样吗?我还认为在for循环初始化中包含数组长度变量定义(缓存时)会减少时间,因为解析不需要两次查找“var”关键字,但这似乎也不是情况下。
没有缓存的示例:
for(var i = 0; i < testArray.length; i++){
//
}
缓存的例子
var len = testArray.length;
for(var i = 0; i < len; i++){
//
}
在for循环初始化中定义缓存变量的示例
for(var i = 0, len=testArray.length; i < len; i++){
//
}
答案 0 :(得分:3)
有人可以解释为什么会这样吗?
此优化和案例非常常见,因此现代JavaScript引擎会自动为您执行此优化。
一些注意事项:
querySelectorAll
答案 1 :(得分:1)
您发布的方案的性能取决于JS引擎优化器的智能程度。当您使用变量时,具有非常转储优化器(或根本没有优化器)的引擎可能会更快,但您甚至不能依赖它。毕竟,长度的类型是众所周知的,而变量可以是任何东西,可能需要额外的检查。 鉴于完美的优化器,所有三个示例都应该具有相同的性能。而且你的例子非常简单,现代引擎很快就会达到这一点。