国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

你必須知道的JavaScript 中字符串連接的性能的一些問題

2019-11-20 22:44:14
字體:
供稿:網(wǎng)友

而JavaScript的核心是ECMAScript 。與其他語言類似,ECMAScript 的字符串是不可變的,即它們的值不能改變。

請考慮下面的代碼:

復制代碼 代碼如下:

var str = "hello ";
str += "world";實際上,這段代碼在幕后執(zhí)行的步驟如下:

1.創(chuàng)建存儲 "hello " 的字符串。
2.創(chuàng)建存儲 "world" 的字符串。
3.創(chuàng)建存儲連接結(jié)果的字符串。
4.把 str 的當前內(nèi)容復制到結(jié)果中。
5.把 "world" 復制到結(jié)果中。
6.更新 str,使它指向結(jié)果。

每次完成字符串連接都會執(zhí)行步驟 2 到 6,使得這種操作非常消耗資源。如果重復這一過程幾百次,甚至幾千次,就會造成性能問題。解決方法是用 Array 對象存儲字符串,然后用 join() 方法(參數(shù)是空字符串)創(chuàng)建最后的字符串。想象用下面的代碼代替前面的代碼:

復制代碼 代碼如下:

var arr = new Array();
arr[0] = "hello ";
arr[1] = "world";
var str = arr.join("");

這樣,無論數(shù)組中引入多少字符串都不成問題,因為只在調(diào)用 join() 方法時才會發(fā)生連接操作。此時,執(zhí)行的步驟如下:

1.創(chuàng)建存儲結(jié)果的字符串
2.把每個字符串復制到結(jié)果中的合適位置
雖然這種解決方案很好,但還有更好的方法。問題是,這段代碼不能確切反映出它的意圖。要使它更容易理解,可以用 StringBuffer 類打包該功能:

復制代碼 代碼如下:

function StringBuffer () {
  this._strings_ = new Array();
}

StringBuffer.prototype.append = function(str) {
  this._strings_.push(str);
};

StringBuffer.prototype.toString = function() {
  return this._strings_.join("");
};


這段代碼首先要注意的是 strings 屬性,本意是私有屬性。它只有兩個方法,即 append() 和 toString() 方法。append() 方法有一個參數(shù),它把該參數(shù)附加到字符串數(shù)組中,toString() 方法調(diào)用數(shù)組的 join 方法,返回真正連接成的字符串。要用 StringBuffer 對象連接一組字符串,可以用下面的代碼:
復制代碼 代碼如下:

var buffer = new StringBuffer ();
buffer.append("hello ");
buffer.append("world");
var result = buffer.toString();

基于上面的實現(xiàn)我們來進行一下運行時間對比,即以“+”逐個進行字符串連接和我們封裝的工具。可用下面的代碼測試 StringBuffer 對象和傳統(tǒng)的字符串連接方法的性能,在chrome控制臺輸入一下代碼并運行:
復制代碼 代碼如下:

var d1 = new Date();
var str = "";
for (var i=0; i < 10000; i++) {
    str += "text";
}
var d2 = new Date();

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");


這段代碼對字符串連接進行兩個測試,第一個使用加號,第二個使用 StringBuffer 類。每個操作都連接 10000 個字符串。日期值 d1 和 d2 用于判斷完成操作需要的時間。請注意,創(chuàng)建 Date 對象時,如果沒有參數(shù),賦予對象的是當前的日期和時間。要計算連接操作歷經(jīng)多少時間,把日期的毫秒表示(用 getTime() 方法的返回值)相減即可。這是衡量 JavaScript 性能的常見方法。該測試的結(jié)果可以幫助您比較使用 StringBuffer 類與使用加號的效率差異。

上例運行結(jié)果如下:

那么有人也許會說JavaScript的String對象中不是也封裝一個concat()方法么,我們在下面也來用concat()方法來做同樣的事情,在consoel輸入以下代碼:

復制代碼 代碼如下:

var d1 = new Date();
var str = "";
for (var i=0; i < 10000; i++) {
    str.concat("text");
}
var d2 = new Date();

console.log("Concatenation with plus: "
 + (d2.getTime() - d1.getTime()) + " milliseconds");


我們可以看到做10000次字符竄連接它的耗時是:

由此可以得出結(jié)論,當涉及到一定數(shù)量的字符串連接時,我們在Javascript中封裝一個類似Java中的StringBuffer對象(函數(shù))來進行操作會在性能上得到提升。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 神农架林区| 内丘县| 呼和浩特市| 凤山市| 额济纳旗| 昌乐县| 湟源县| 贵港市| 寿阳县| 华池县| 麻栗坡县| 襄垣县| 亚东县| 万州区| 兴宁市| 娄底市| 宁明县| 龙游县| 青阳县| 峨山| 田林县| 荥经县| 运城市| 龙泉市| 远安县| 堆龙德庆县| 确山县| 邵阳市| 习水县| 皋兰县| 洛南县| 白沙| 扎囊县| 云浮市| 县级市| 乾安县| 宣汉县| 望谟县| 汨罗市| 霍山县| 黄梅县|