麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 編程 > JavaScript > 正文

你必須知道的JavaScript 中字符串連接的性能的一些問(wèn)題

2019-11-20 22:44:14
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

請(qǐng)考慮下面的代碼:

復(fù)制代碼 代碼如下:

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

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

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

復(fù)制代碼 代碼如下:

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

這樣,無(wú)論數(shù)組中引入多少字符串都不成問(wèn)題,因?yàn)橹辉谡{(diào)用 join() 方法時(shí)才會(huì)發(fā)生連接操作。此時(shí),執(zhí)行的步驟如下:

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

復(fù)制代碼 代碼如下:

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

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

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


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

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

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

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


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

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

那么有人也許會(huì)說(shuō)JavaScript的String對(duì)象中不是也封裝一個(gè)concat()方法么,我們?cè)谙旅嬉瞾?lái)用concat()方法來(lái)做同樣的事情,在consoel輸入以下代碼:

復(fù)制代碼 代碼如下:

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次字符竄連接它的耗時(shí)是:

由此可以得出結(jié)論,當(dāng)涉及到一定數(shù)量的字符串連接時(shí),我們?cè)贘avascript中封裝一個(gè)類似Java中的StringBuffer對(duì)象(函數(shù))來(lái)進(jìn)行操作會(huì)在性能上得到提升。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产一区二区不卡 | 久草视频国产在线 | 久久伊人国产精品 | 黄色电影免费提供 | 国产九九九九 | 99麻豆久久久国产精品免费 | 欧美精品一区二区性色 | 亚洲网站一区 | 午夜av男人的天堂 | 国产精品一区二区免费在线观看 | av不卡毛片 | 久久精品亚洲精品国产欧美kt∨ | 成人免费在线网 | 黑人一区二区三区四区五区 | 操你逼| 日本欧美一区二区三区在线播 | 国产手机av在线 | 欧美韩国日本在线 | 久综合色 | 亚洲精品午夜电影 | 18被视频免费观看视频 | 噜噜色av | 国产成人精品网站 | 99成人精品视频 | 欧美视屏一区二区 | 中文字幕在线成人 | videos高潮 | 黄色片免费看网站 | 毛片网站视频 | 黄色视频a级毛片 | 国产亚洲精品久久久久久久久久 | 国产伦精品一区二区三区 | 黄色免费在线网址 | 国产噜噜噜| 欧美乱论| 一级毛片在线看 | 超级av在线 | 久久国产精品区 | 国产自在线| 日产精品久久久一区二区福利 | 在线中文资源免费 |