哪种方式更有效?有区别吗?
这一个:
var str = 'abc';
if(str.length == 20) {
//...
}
if(str.length == 25) {
//...
}
// and so on
或者这个:
var str = 'abc';
var length = str.length;
if(length == 20) {
//...
}
if(length == 25) {
//...
}
// and so on
答案 0 :(得分:9)
在可能实际上重要的浏览器中(读取:IE),每次都会计算它,因此将值存储在局部变量中会更快。
http://jsperf.com/string-length
var len = someArray.length;
for (var i=0; i<len; i++) {
// ...
}
比
更快for (var i=0; i<someArray.length; i++) {
// ...
}
但是现在,V8(Chrome的JS引擎)优化后者以比前者更快的速度运行。这很棒 - 请记住,你真的不需要担心Chrome中的性能。
如果您想了解有关JavaScript性能的更多信息,High Performance JavaScript是一本可靠的读物。尽管如此,以一丝不苟的态度来看待它的建议,因为在IE(6,7,8或甚至9)中使代码运行得更快的技巧可能会使代码在Chrome或Firefox 4中运行得更慢。
答案 1 :(得分:1)
第二种是到目前为止更安全的方式。在第一个你假设它不会被重新计算。在第二个你知道它不会。第二种并不总是最好的方式。只有当您知道其他进程不会影响数组的长度时,它才会起作用。因此,对于全局变量等,您必须要小心。这也可以应用于修改for循环内的数组的内容(长度),该循环停止在数组的上限。
答案 2 :(得分:1)
Strings are immutable in JavaScript,因此即使是错误的Javascript实现也不太可能在每次访问时重新计算字符串的length属性。
你可以使用jsperf自己测试一下;使用Chrome 12,it actually looks like your first example is faster。
答案 3 :(得分:0)
理论上,我希望第二个代码块应该更快。
然而,鉴于今天的JS解释器实际上是高度优化的JIT编译器,我想他们会发现这种事情并对其进行优化。
这应该适用于目前主流使用的几乎所有浏览器,除了IE8及更低版本之外,任何人都猜测它是如何做到的,但无论如何都会很慢。