是每次调用javascript str.length还是只调用一次?

时间:2011-05-24 14:49:37

标签: javascript

哪种方式更有效?有区别吗?

这一个:

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

4 个答案:

答案 0 :(得分:9)

在可能实际上重要的浏览器中(读取:IE),每次都会计算它,因此将值存储在局部变量中会更快。

http://jsperf.com/string-length


used to be

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及更低版本之外,任何人都猜测它是如何做到的,但无论如何都会很慢。