Javascript 字符串长度是常数时间吗?

问题描述 投票:0回答:6

我对 JS 相当陌生,并且意识到长度被视为一种属性。但我收到一条评论,要求不要在循环中使用 str.length :

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

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

现在,我知道 str.length() 在 Java 中是恒定时间操作,因为长度存储为 String 类中的字段。但话又说回来,字符串在 Java 中是不可变的。 不过我不确定 JS 字符串。 str.length在JS中也能保证恒定时间吗?在网络上找不到讨论此问题的任何地方。

javascript string performance
6个回答
19
投票

JavaScript 中的字符串也是不可变的。

length
属性不需要在每次访问时都进行计算。

我创建了一个 jsperf 基准测试供您在此处查看。

您会注意到速度是相同的。


6
投票

str.length
在JS中也能保证恒定时间吗?

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

但是,是的,可以预期它可以在恒定时间内访问,并且访问时不需要动态线性时间长度计算。 ECMAScript 规范还将 String

.length
属性 描述为不可变的,并且在构造字符串时对其进行初始化。


2
投票

在任何具有模拟字符串的语言中,无论是 Java、JavaScript、C# 还是其他语言,语言的创建者不为字符串提供“恒定时间”“长度”操作将是一个非常糟糕的做法。
由于字符串是不可变的,因此它的长度不能改变,因此所需要的只是在创建字符串对象内的某个字段时存储字符串的长度,并在调用“length”属性/方法时返回它。


0
投票

这个问题似乎已经得到了很好的回答,但这里还有 2 美分,可能会有帮助。

如果字符串被循环内不同长度的内容覆盖,则使用

string.length
可能会在 for 循环中导致意外行为,例如:

var k = "abcabcabc";
for(var i=0; i<k.length; i++){
  k=k.slice(0,-1);
  console.log(k);
}

将记录“abcabcab”,“abcabca”,...,“abca”,然后停止,因为长度正在变化。

当然,这可能是故意的,在这种情况下就去做吧(尽管可以说你应该使用 while 循环)。


0
投票

长度是一个实例属性,它是常数时间

它必须实现一个给定长度的字符串,该字符串表示为连续的、以零结尾的 jschar 数组。它通过显式存储长度和指向以零结尾的数组的指针来实现此目的

这里显式存储的是指示符,表示它是恒定时间。

阅读 如何在 SpiderMonkey 中实现字符串 有关 Firefox 如何实现字符串的更多信息。


0
投票

如果你有一个const,你可以使用类似的东西

const num= '';
console.log(num.length);

and if you want to use a condition you can put something like this

if(num.lenght > 0) {
// YOUR CODE
}
© www.soinside.com 2019 - 2024. All rights reserved.