1. ECMAScript 文字列は不変、つまり値を変更できないため、次のコードを記述するとどうなりますか?
Js コード
var str = " Hello ";
str = "world";
実行する手順は次のとおりです:
「Hello」を格納する文字列を作成します
「」を格納する文字列を作成しますworld"
ストレージの作成 結果の文字列を連結
str の現在の内容を結果にコピー
"world" を結果にコピー
結果を指すように str を更新
文字列の連結が完了するたびに実行される手順 2 ~ 6 により、この操作は非常にリソースを大量に消費します。このプロセスを何百回、あるいは何千回も繰り返すと、パフォーマンスはどうなるでしょうか。
2. 次に、このジレンマを解決するために次のコードを見てください Js コード
var arr = new Array;
arr[0] = "Hello ";
arr[1] = "world"; var str = arr.join("");
実行される手順は次のとおりです:
結果を保存する文字列を作成します
各文字列を結果内の適切な場所にコピーします
この方法では、結合操作は join() メソッドが呼び出されたときにのみ発生するため、配列にどれだけ多くの文字列が導入されても問題はありません。
3. 操作は複雑だと思いますか?
コードはその意図を正確に反映していませんか?そこで、理解を容易にするためにオブジェクト ソリューションを使用し、StringBuffer クラスを使用してこの関数をカプセル化しましょう。 Js コード
function StringBuffer() {
this._strs = new Array;
}
StringBuffer.prototype.append = function (str ) {
this._strs.push(str);
};
StringBuffer.prototype.toString = function() {
this._strs.join("");
それでは、文字列をどのように操作するかを見てみましょう。
Js コード
var sb = new StringBuffer() ;
sb.append("世界");
四、美味しそうだけど、食べるとどんな効果があるの?
Js コード
コードをコピー
for(var i=0;i{
str = "text"
}
var tEnd = new Date();
document.write("10000 個の文字列を結合するための元のメソッドのプラス記号には時間がかかります:" (tEnd.getTime()-tStart.getTime()) "秒"); >var oSB = new StringBuffer();
tStart = new Date();
for(var i=0;i{
oSB.append("text") ;
}
var sRst = oSB.toString();
tEnd = new Date();
document.write("
StringBuffer 10000 個の文字列を結合するには時間がかかります。 " ( tEnd.getTime()-tStart.getTime()) "秒");
おそらく StringBuffer のほうが速いと推測できますが、どれくらい速いのでしょうか?私のテスト結果:
Js コード
FF3.0.10
元のメソッドのプラス記号は 10,000 個の文字列を結合するのに時間がかかります: 3 ミリ秒StringBuffer は 10,000 個の文字列を結合するのに時間がかかります: 8 ミリ秒
IE7
元のメソッドのプラス記号は 10,000 個の文字列を結合するのにかかる時間: 15 ミリ秒
StringBuffer 10,000 個の文字列を結合するのにかかる時間: 16 ミリ秒
IE8
元のメソッドのプラス記号 10,000 個の文字列を結合するのにかかる時間文字列: 15 ミリ秒
StringBuffer 10,000 個の文字列を結合するのにかかる時間: 16 ミリ秒
Chrome1.0.154.46
元のメソッドと 10,000 個の文字列を結合するのにかかる時間の合計: 1 ミリ秒
StringBuffer 10,000 個の文字列を結合するのにかかる時間: 2 ミリ秒
5. 何が起こっているのでしょうか?
え?目が見える?それとも、掲載された検査結果が間違っているのでしょうか?まだ……?
何も問題ありません!
「JavaScript Advanced Programming」という本は 2006 年 11 月に出版されました。そのページの 84 ~ 85 にあります。私のテスト結果は、それとはまったく逆です。それとも技術的な変化でしょうか?
これは教訓だと思います!奥深いレッスン!この記事を読んだ人がどう思うかは分かりません。