javaScript中的String的、拼接:
與其他語言類似、ECMAScript的字串是不可變的、即它們的值不能改變。考慮下面的代碼:
var str = "hello";
str += "world";
實際上,這段代碼在幕後執行的步驟如下:
1、建立儲存"hello"的字串。
2、建立儲存"world"的字串。
3、建立儲存串連結果的字串。
4、把str的當前內容複寫到結果中。
5、把"world"複製到結果中。
6、更新str、使它指向結果。
如果重複這一過程次數較多、就會造成效能問題。
解決方案是用ArrayObject Storage Service字串、然後用join()方法(參數是Null 字元串)建立最後的字串:
var arr = new Array;
arr[0] = "hello";
arr[1] = "world";
var str = arr.join("");
此時、執行步驟如下:
1、建立儲存結果的字串。
2、把每個字串複製到結果中的合適位置。
更好的解決辦法可以使用StringBuffer類打包該功能:
function StringBuffer(){
this._string_ = new Array;
}
StringBuffer.prototype.append = function(str){
this._string_.push(str);
};
StringBuffer.prototype.toString = function(){
return this._string_.join("");
};
/**由於javaScript沒有公私(有)屬性的區別、這樣聲明string只是為了標識它本意是私人屬性。
測試一下StringBuffer對象和傳統的字串串連方法的效能:
*/
var d1 = new Date();
var str = "";
for(var i =0 ; i < 10000; i++){
str +="效能測試";
}
var d2 = new Date();
document.write("加號串連:<font color='red;'>"+(d2.getTime()-d1.getTime())+"</font> 所用時間");
var oBuffer = new StringBuffer();
d1 = new Date();
for(var i =0 ; i < 10000; i++){
oBuffer.append("效能測試");
}
var sREsult = oBuffer.toString();
d2 = new Date();
document.write("<br/>StringBuffer串連:<font color='red;'>"+(d2.getTime()-d1.getTime())+"</font> 所用時間");
IE6測試結果: www.2cto.com
加號串連:2094 所用時間
StringBuffer串連:47 所用時間
結果顯而易見、但是如果資料量不是非常大、完全沒有必要這樣做
但是用IE8跟360、Google這些瀏覽器測試結果又完全不同
應該是javaScript對傳統的""+""方法進行了最佳化、
畢竟這個樣本是很老很老的了出自————《javascript進階程式設計》
Google瀏覽器測試:
加號串連:0 所用時間
StringBuffer串連:2 所用時間
百度了很久、木有什麼好的結果
看來以後寫串連最佳化還要注意瀏覽器呀
不過現在估計用IE6的很少很少了吧!!! 也希望瞭解情況的大俠看到給解釋解釋!!!感激不盡!!!
/**
* 查詢數組中是否存在某個元素
* @param {Object} sValue 元素值
* @memberOf {TypeName}
* @return {Int} 返回-1則說明不存在、否則返回該元素在數組中的索引值
*/
Array.prototype.indexOfHzw = function (sValue){
for(var i=0; i < this.length; i++){
if(sValue == this[i]){
return i ;
}
}
return -1;
}
var array = new Array("red","blue","yellow","fuck");
alert(array.indexOfHzw("fuck"));
<script type="text/javascript">
/**
* 建立新方法
*/
Object.prototype.showValue = function(){
alert(this.valueOf());
};
var str = "hello";
var iNum = 26;
str.showValue();
iNum.showValue();
/**
* 從定義已有方法
*/
Function.prototype.toString = function (){
return "從定義方法";
};
function fTry(){
alert("Try");
}
alert(fTry.toString());
</script>
看來prototype很給力!!!
摘自 旦旦而學的專欄