どのようにJSの悪い文字列の接続を抜け出して、私は落とし穴に落ちました.


一、ECMAScriptの文字列は可変ではないです.つまり、それらの値は変えられないので、下のコードを書く時に何が発生しましたか?
var str = "Hello ";
str += "world";
 実行する手順は以下の通りです.
  • 「ハロー」を格納する文字列
  • を作成します.
  • は、「world」を格納する文字列
  • を作成する.
  • は、接続結果を格納する文字列
  • を作成する.
  • strの現在の内容を結果にコピーします.
  • 「world」を結果にコピーする
  • .
  • は、結果を指すようにstrを更新する
  • .
        文字列の接続が完了するたびに、ステップ2-6が実行されます.このような操作は資源を非常に消費します.このプロセスを何百回か繰り返したり、何千回も繰り返したりしますが、その性能はどうですか?
     
    二、じゃ、次のコードを見て、この状況を解決します.
    var arr = new Array;
    arr[0] = "Hello ";
    arr[1] = "world";
    var str = arr.join(""); 
    実行する手順は以下の通りです.
  • は、結果を格納する文字列
  • を作成する.
  • は、各文字列を結果の適切な位置にコピーする
  • .
    このように、配列がどれぐらいの文字列を導入しても問題になりません.ジョイン()メソッドを呼び出したときだけ接続操作が発生します.
     
    三、操作が複雑だと思いますか?コードはその意図に正確に反応しません.対象の解決方法を使いましょう.分かりやすくして、SteringBuffer類でこの機能をカプセル化します.
    function StringBuffer() {
        this._strs = new Array;
    }
    
    StringBuffer.prototype.append = function (str) {
        this._strs.push(str);
    };
    
    StringBuffer.prototype.toString = function() {
        this._strs.join("");
    };
    
        はい、感じてください.文字列はどうやって操作しますか?
    var sb = new StringBuffer();
    sb.append("Hello ");
    sb.append("world");
    var result = sb.toString();
     
    四、色と香りは全部揃っているようですが、食べ続ける効果はどうですか?
    var tStart = new Date();
    var str = "";
    for(var i=0;i<10000;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<10000;i++)
    {
        oSB.append("text");
    }
    var sRst = oSB.toString();
    tEnd = new Date();
    
    document.write("<br/>StringBuffer   10000         :"+(tEnd.getTime()-tStart.getTime())+" ");
    
     
       もう推測したかもしれませんが、StringBufferは+より速いです.いったいどれぐらい早いですか?私のテスト結果:
     
     
    FF3.0.10
              10000         :3  
    StringBuffer   10000         :8   
    
    IE7
              10000         :15  
    StringBuffer   10000         :16   
    
    IE8
              10000         :15  
    StringBuffer   10000         :16  
    
    Chrome1.0.154.46
              10000         :1  
    StringBuffer   10000         :2  
    
     
    えっと、どういうことですか?
     
        えっと、目がかすみましたか?それともテスト結果を間違えましたか?それとも…?
     
        すべては間違っていません.
     
        2006年11月にこの本は『JavaScript高級手順設計』を出版しました.84-85ページで、私の上の内容です.私のテスト結果はそれとは正反対です.技術の変革ですか?それとも?
     
        教訓だと思います.深い教訓です.この文章をどこで読んだか分からない人はどう思いますか?