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