They are immutable. You cannot change a character within a string with something like var myString = "abbdef"; myString[2] = 'c'
. The string manipulation methods such as trim
, slice
return new strings.
In the same way, if you have two references to the same string, modifying one doesn't affect the other
let a = b = "hello";
a = a + " world";
// b is not affected
However, I've always heard what Ash mentioned in his answer (that using Array.join is faster for concatenation) so I wanted to test out the different methods of concatenating strings and abstracting the fastest way into a StringBuilder. I wrote some tests to see if this is true (it isn't!).
This was what I believed would be the fastest way, though I kept thinking that adding a method call may make it slower...
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('');
}
Here are performance speed tests. All three of them create a gigantic string made up of concatenating "Hello diggity dog"
one hundred thousand times into an empty string.
I've created three types of tests
- Using
Array.push
and Array.join
- Using Array indexing to avoid
Array.push
, then using Array.join
- Straight string concatenation
Then I created the same three tests by abstracting them into StringBuilderConcat
, StringBuilderArrayPush
and StringBuilderArrayIndex
http://jsperf.com/string-concat-without-sringbuilder/5 Please go there and run tests so we can get a nice sample. Note that I fixed a small bug, so the data for the tests got wiped, I will update the table once there's enough performance data. Go to http://jsperf.com/string-concat-without-sringbuilder/5 for the old data table.
Here are some numbers (Latest update in Ma5rch 2018), if you don't want to follow the link. The number on each test is in 1000 operations/second (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 |
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…