好好學一遍JavaScript 筆記(三)

來源:互聯網
上載者:User

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很給力!!!

摘自 旦旦而學的專欄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.