最近、「JavaScript Advanced Programming」の研究では、文字列の特性の説明があります。元のテキストはほぼ次のとおりです。ECMascriptの文字列は不変です。つまり、文字列が作成されると、値を変更できません。変数の保存された文字列を変更するには、最初に元の文字列を破壊し、次に変数に新しい値を含む別の文字列を入力します。
コードコピーは次のとおりです。
var lang = "Java";
lang = lang + "script";
この操作を実装するプロセスは次のとおりです。最初に10文字を保持できる新しい文字列を作成し、次にこの文字列に「Java」と「スクリプト」で記入します。最後のステップは、これらの2つの文字列が役に立たないため、元の文字列「Java」と「スクリプト」を破壊することです。ただし、ブラウザの低いバージョン(IE6など)では、文字列スプライシング速度はパフォーマンスを消費するプロセスです。
これから私はジャワのことを考えます。 Javaの文字列メカニズムはJSに似ています(つまり、作成後に変更することはできず、変更することは元の値を破壊するだけです)が、Javaには文字列の不変性の問題を解決するStringBufferがあり、JSには同様の方法がありません。しかし、この緩衝メカニズムをシミュレートすることができます。原則は、スプライシングに配列を使用することです。ソースコードは次のとおりです。
コードコピーは次のとおりです。
関数stringbuffer(){
この.__文字列__ = new Array();
}
stringbuffer.prototype.append = function(str){
この.__文字列__。プッシュ(str);
これを返します。 //便利なチェーン操作
}
stringbuffer.prototype.tostring = function(){
これを返します。__文字列__。結合( "");
}
/*テスト*/
var buffer = new StringBuffer();
buffer.append( "hello")。append( "javascript");
var result = buffer.toString();
アラート(結果);
PS:GISTアドレスは次のとおりです:https://gist.github.com/hehongwei44/fe71f10e4d2d9295aeab
メカニズムをシミュレートしましたが、この方法と文字列スプライシングの間にはパフォーマンスに違いがあります。テストできます。テストコードは次のとおりです。
コードコピーは次のとおりです。
var d1 = new date();
var str = "";
for(var i = 0; i <10000; i ++){
str += "text";
}
var d2 = new date();
document.write( "テスト1コスト:" +(d2.gettime() - d1.gettime())/1000 + "秒" + "<br/>");
var obuffer = new StringBuffer();
d3 = new date();
for(var i = 0; i <10000; i ++){
obuffer.append( "text");
}
var sresult = obuffer.tostring();
d4 = new Date();
document.write( "2つのコストをテストする:" +(d4.getTime() - d3.getTime())/1000 + "秒");
テスト結果は次のとおりです。(テスト結果は環境が異なる場合があります):
1.ベースと1000倍の比較する場合、両方の実行は非常に高速(基本ミリ秒)であり、ほぼ同じ時間がかかります。前者の後者の差は、10ミリ秒を超えません。
2。ベースの10,000倍で、実行結果は上記に似ていますが、前者はIE6の下でより多くの電話請求書を持っています。
3.ベースの100,000倍で、IE6の弦のスプライシングは明らかに時間がかかり、他のブラウザはそれほど違いはなく、一部はStringBufferよりも短いものもあります。
結論は
1.スプライシングワードの数が1,000倍未満の場合、前者を大胆に使用し、何千ものスプライシング時間に遭遇することはめったにありません。
2.他のブラウザには、主にIE6、スプライシングにパフォーマンスの問題がありません。スプライシング時間に数万または数十万の費用がかかる場合は、StringBufferを使用してIE6のみをシミュレートすることをお勧めします。