当前位置: 首页 > 面试题库 >

JavaScript字符串是不可变的吗?我需要JavaScript中的“字符串生成器”吗?

林英武
2023-03-14
问题内容

JavaScript是否使用不可变或可变的字符串?我需要一个“字符串生成器”吗?


问题答案:

他们是一成不变的。您不能使用诸如此类来更改字符串中的字符var myString = "abbdef"; myString[2] = 'c'。该字符串操作方法,例如trimslice返回新的字符串。

同样,如果您对同一个字符串有两个引用,则修改一个不会影响另一个

let a = b = "hello";
a = a + " world";
// b is not affected

但是,我总是听到Ash在他的回答中提到的内容(使用Array.join进行连接的速度更快),因此我想测试一下连接字符串并将最快的方法抽象为StringBuilder的不同方法。我写了一些测试来看看这是否正确(不是!)。

我一直认为这是最快的方法,尽管我一直认为添加方法调用可能会使它变慢。

function StringBuilder() {
    this._array = [];
    this._index = 0;
}

StringBuilder.prototype.append = function (str) {
    this._array[this._index] = str;
    this._index++;
}

StringBuilder.prototype.toString = function () {
    return this._array.join('');
}

这是性能速度测试。他们三个都创建了一个巨大的字符串,该字符串由将"Hellodiggitydog"十万次连接成一个空字符串组成。

我创建了三种类型的测试

  • 使用Array.pushArray.join
  • 使用数组索引避免Array.push,然后使用Array.join
  • 直串连接

然后,我通过将它们抽象为StringBuilderConcatStringBuilderArrayPushStringBuilderArrayIndex
来创建了这三个测试,请去那里运行测试,以便获得一个不错的示例。请注意,我修复了一个小错误,因此擦除了测试数据,一旦有足够的性能数据,我将更新表。以获取旧数据表。

如果您不想点击链接,请查看以下数字(Ma5rch 2018中的最新更新)。每次测试的数量以1000次操作/秒为单位( 越高越好

| Browser          | Index | Push | Concat | SBIndex | SBPush | SBConcat |
---------------------------------------------------------------------------
| Chrome 71.0.3578 | 988   | 1006 | 2902   | 963     | 1008   | 2902     |
| Firefox 65       | 1979  | 1902 | 2197   | 1917    | 1873   | 1953     |
| Edge             | 593   | 373  | 952    | 361     | 415    | 444      |
| Exploder 11      | 655   | 532  | 761    | 537     | 567    | 387      |
| Opera 58.0.3135  | 1135  | 1200 | 4357   | 1137    | 1188   | 4294     |

发现

  • 如今,所有常绿的浏览器都能很好地处理字符串连接。Array.join仅帮助IE 11

  • 总体而言,Opera最快,是Array.join的4倍

  • Firefox仅次于Array.joinFF,但速度稍慢,但在Chrome中则慢得多(3倍)。

  • Chrome排名第三,但字符串concat的速度比Array.join快3倍

  • 创建一个StringBuilder似乎不会对性能产生太大影响。

希望其他人觉得这有用



 类似资料:
  • 问题内容: Douglas Crockford喜欢说在javascript原型面向对象语言中不需要。 他解释说,添加这些代码只是为了使来自基于类(即“ 经典 ”)的面向对象的编程语言的人们感到某种程度的舒适: JavaScript中,我们很难雅 JavaScript是一种原型语言,但是它有一个运算符,试图使它看起来像古典语言。这往往会使程序员感到困惑,从而导致一些有问题的编程模式。 您无需在Jav

  • 问题内容: 我想要一个5个字符串,该字符串由从集合中随机选择的字符组成。 用JavaScript做到这一点的最佳方法是什么? 问题答案: 我认为这将为您工作:

  • 我们都知道在Java中是不可变的,但是检查下面的代码: 为什么这个程序会这样操作?为什么和的值被更改了,而却没有被更改?

  • 我有两个字符串,string1和string2。我想检查string1是否可以由string2中的字符组成(没有重复字符)。例如,如果string1是“工具”,string2是“环礁”,函数将返回false。如果string1是“触摸”,string2是“chetoudce”,它将返回true。 在Javascript中最有效的方法是什么?我在考虑使用indexOf,然后从string2中删除用来

  • 问题内容: 我们都知道这String在Java 中是不可变的,但是请检查以下代码: 为什么该程序会这样运行?为何值和改变了,但没有改变? 问题答案: 是不可变的*,但这仅意味着你无法使用其公共API对其进行更改。 你在这里所做的是使用反射来绕过常规API。同样,你可以更改枚举的值,更改整数自动装箱中使用的查找表等。 现在,原因s1和s2变化值是它们都引用相同的实习字符串。编译器执行此操作(如其他答

  • 问题内容: 在 “ Swift编程语言” 的“字符串”部分的“字符串 可变性” 小节中,它表示: 您可以通过将某个变量分配给变量(在这种情况下可以修改)或常量(在这种情况下不能修改)来指示是否可以修改(或 变异 ): 并给出示例代码: 这本书中的iBooks 这里,或在Web浏览器在这里。 在下一段中,它声称“字符串是值类型”。 我的问题:对我来说,这看起来像个可变的字符串。看起来就像我在Java