而JavaScript的核心是ECMAScript 。與其他語(yǔ)言類似,ECMAScript 的字符串是不可變的,即它們的值不能改變。
請(qǐng)考慮下面的代碼:
每次完成字符串連接都會(huì)執(zhí)行步驟 2 到 6,使得這種操作非常消耗資源。如果重復(fù)這一過(guò)程幾百次,甚至幾千次,就會(huì)造成性能問(wèn)題。解決方法是用 Array 對(duì)象存儲(chǔ)字符串,然后用 join() 方法(參數(shù)是空字符串)創(chuàng)建最后的字符串。想象用下面的代碼代替前面的代碼:
1.創(chuàng)建存儲(chǔ)結(jié)果的字符串
2.把每個(gè)字符串復(fù)制到結(jié)果中的合適位置
雖然這種解決方案很好,但還有更好的方法。問(wèn)題是,這段代碼不能確切反映出它的意圖。要使它更容易理解,可以用 StringBuffer 類打包該功能:
StringBuffer.prototype.append = function(str) {
this._strings_.push(str);
};
StringBuffer.prototype.toString = function() {
return this._strings_.join("");
};
console.log("Concatenation with plus: "
+ (d2.getTime() - d1.getTime()) + " milliseconds");
var buffer = new StringBuffer();
d1 = new Date();
for (var i=0; i < 10000; i++) {
buffer.append("text");
}
var result = buffer.toString();
d2 = new Date();
console.log("Concatenation with StringBuffer: "
+ (d2.getTime() - d1.getTime()) + " milliseconds");
那么有人也許會(huì)說(shuō)JavaScript的String對(duì)象中不是也封裝一個(gè)concat()方法么,我們?cè)谙旅嬉瞾?lái)用concat()方法來(lái)做同樣的事情,在consoel輸入以下代碼:
console.log("Concatenation with plus: "
+ (d2.getTime() - d1.getTime()) + " milliseconds");
由此可以得出結(jié)論,當(dāng)涉及到一定數(shù)量的字符串連接時(shí),我們?cè)贘avascript中封裝一個(gè)類似Java中的StringBuffer對(duì)象(函數(shù))來(lái)進(jìn)行操作會(huì)在性能上得到提升。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注