它们是不变的.不能用var myString = "abbdef"; myString[2] = 'c'
这样的数字来更改字符串中的字符.字符串操作方法(如trim
、slice
)返回新字符串.
同样,如果对同一字符串有两个引用,修改其中一个不会影响另一个
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('');
}
以下是性能速度测试.这三个元素都创建了一个巨大的字符串,由10万次连接组成一个空字符串.
我创建了三种类型的测试
Array.push
和Array.join
Array.push
,然后使用Array.join
然后我创建了同样的三个测试,将它们抽象为StringBuilderConcat
、StringBuilderArrayPush
和StringBuilderArrayIndex
.http://jsperf.com/string-concat-without-sringbuilder/5请go 那里运行测试,这样我们就可以得到一个好的样本.请注意,我修复了一个小错误,因此测试数据被删除,一旦有足够的性能数据,我将更新该表.对于旧数据表,请转至http://jsperf.com/string-concat-without-sringbuilder/5.
这里有一些数字(2018年Ma5rch的最新更新),如果你不想关注这个链接的话.每次测试的次数为higher is better0次/秒(higher is better)
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 |
Findings
如今,所有evergreen浏览器都能很好地处理字符串连接.Array.join
只对IE 11有帮助
总体而言,Opera速度最快,是Array的4倍.参加
Firefox排在第二位,Array.join
在FF中的速度略慢,但在Chrome中的速度要慢很多(3倍).
Chrome位居第三,但String Concat的速度是Array.Join的3倍
创建StringBuilder似乎不会对性能产生太大影响.
希望其他人觉得这个有用
Different Test Case
因为@RoyTinker认为我的测试有缺陷,所以我创建了一个新的 case ,它不会通过连接相同的字符串来创建大字符串,它为每次迭代使用不同的字符.字符串连接看起来仍然更快,或者说同样快.让我们开始那些测试吧.
我建议每个人都应该继续思考其他方法来测试这一点,并且可以在下面为不同的测试用例添加新的链接.