Javascript字符串长度是恒定时间吗?

aal*_*ous 15 javascript string performance

我对JS很新,并且认识到长度被视为属性.但我收到一条评论,不在循环中使用str.length:

for (i=0; i<str.length; i++){...}

VS

var len = str.length;
for (i=0; i<len; i++){...}
Run Code Online (Sandbox Code Playgroud)

现在,我知道str.length()是Java中的常量时间操作,因为长度存储为String类中的字段.但话说回来,字符串在Java中是不可变的.我不确定JS字符串.str.length是否也保证了JS中的常量时间?无法在网络的任何地方找到这个.

mač*_*ček 13

字符串在JavaScript中也是不可变的.length每次访问该属性时都不需要计算该属性.

我为你创建了一个jsperf基准测试.

你会注意到速度是一样的.

  • 情况并非总是如此.10年前(在jsperf存在之前)的性能基准测试表明string.length是O(n).因此,将长度或写循环缓存为`for(var i = 0,j = str.length-1; j> = 0; i ++,j--)..`一直是"好习惯".就我个人而言,无论如何我只是使用`length`而且这些日子并不重要 (2认同)

Ber*_*rgi 5

str.lengthJS 也能保证恒定时间吗?

不,事实上 JavaScript 中没有任何运行时性能或复杂性保证。

然而,是的,可以预期它可以在恒定时间内访问,而无需对访问进行动态线性时间长度计算。ECMAScript 规范还将String.length属性描述为不可变的,并且在构造字符串时对其进行初始化。