資源描述:
《Java Script 優(yōu)化》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、做JavaScript也有段時間了,雖然技術(shù)還是很弱,對于如何優(yōu)化JavaScript我把自己的經(jīng)驗和網(wǎng)上查找的一些資料總結(jié)一下,希望對各位朋友有幫助。廢話不多說咱們開始:語法方面:<一>循環(huán)循環(huán)是很常用的一個控制結(jié)構(gòu),大部分東西要依靠它來完成,在JavaScript中,我們可以使用for(;;),while(),for(in)三種循環(huán),事實上,這三種循環(huán)中for(in)的效率極差,因為他需要查詢散列鍵,只要可以就應該盡量少用。for(;;)和while循環(huán)的性能應該說基本(平時使用時)等價。而事實上,如何使用這兩個循環(huán),則有很大講究。我得出的結(jié)論是:如果是循環(huán)變量遞增或遞減,不要
2、單獨對循環(huán)變量賦值,應該在它最后一次讀取的時候使用嵌套的++或—操作符。如果要與數(shù)組的長度作比較,應該事先把數(shù)組的length屬性放入一個局部變量中,減少查詢次數(shù)。局部變量和全局變量局部變量的速度要比全局變量的訪問速度更快,因為全局變量其實是全局對象的成員,而局部變量是放在函數(shù)的棧當中的。還有,局部變量屏蔽全局變量。最好少使用Eval使用eval相當于在運行時再次調(diào)用解釋引擎對內(nèi)容進行運行,需要消耗大量時間。所以建議不使用。那在什么時候使用呢?比如AJAX返回是JS代碼,你想讓這段代碼執(zhí)行,那么此時你可以使用eval。減少重復查找因為JavaScript的解釋性,所以a.b.c.d
3、.e,需要進行至少4次查詢操作,先檢查a再檢查a中的b,再檢查b中的c,如此往下。所以如果這樣的表達式重復出現(xiàn),應該盡量少出現(xiàn)這樣的表達式,可以利用局部變量,把它放入一個臨時的地方進行查詢。這一點可以和循環(huán)結(jié)合起來,因為我們常常要根據(jù)字符串、數(shù)組的長度進行循環(huán),而通常這個長度是不變的,比如每次查詢a.length,就要額外進行一個操作,而預先把varlen=a.length,則就少了一次查詢。字符串連接如果是追加字符串,最好使用s+=anotherStr操作,而不是要使用s=s+anotherStr。如果要連接多個字符串,應該少使用+=,如s+=a;s+=b;s+=c;應該寫成s+
4、=a+b+c;而如果是收集字符串,比如多次對同一個字符串進行+=操作的話,最好使用一個緩存。怎么用呢?使用JavaScript數(shù)組來收集,最后使用join方法連接起來,如下varbuf=newArray();for(vari=0;i<100;i++){buf.push(i.toString());}varall=buf.join("");類型轉(zhuǎn)換類型轉(zhuǎn)換是大家常犯的錯誤,因為JavaScript是動態(tài)類型語言,你不能指定變量的類型。1.Eg:把數(shù)字轉(zhuǎn)換成字符串,應用""+1,雖然看起來比較丑一點,但事實上這個效率是最高的,性能上來說:(""+)>String()>.toString
5、()>newString()這條其實和下面的“直接量”有點類似,盡量使用編譯時就能使用的內(nèi)部操作要比運行時使用的用戶操作要快。String()屬于內(nèi)部函數(shù),所以速度很快,而.toString()要查詢原型中的函數(shù),所以速度遜色一些,newString()用于返回一個精確的副本。2.浮點數(shù)轉(zhuǎn)換成整型,這個更容易出錯,很多人喜歡使用parseInt(),其實parseInt()是用于將字符串轉(zhuǎn)換成數(shù)字,而不是浮點數(shù)和整型之間的轉(zhuǎn)換,我們應該使用Math.floor()或者Math.round()。另外,Math是內(nèi)部對象,所以Math.floor()其實并沒有多少查詢方法和調(diào)用的時間,
6、速度是最快的。3.對于自定義的對象,如果定義了toString()方法來進行類型轉(zhuǎn)換的話,推薦顯式調(diào)用toString(),因為內(nèi)部的操作在嘗試所有可能性之后,會嘗試對象的toString()方法嘗試能否轉(zhuǎn)化為String,所以直接調(diào)用這個方法效率會更高使用直接量其實這個影響倒比較小,可以忽略。什么叫使用直接量,比如,JavaScript支持使用[param,param,param,…]來直接表達一個數(shù)組,以往我們都使用newArray(param,param,…),使用前者是引擎直接解釋的,后者要調(diào)用一個Array內(nèi)部構(gòu)造器,所以要略微快一點點。同樣,varfoo={}的方式也比
7、varfoo=newObject();快,varreg=/../;要比varreg=newRegExp()快。字符串遍歷操作對字符串進行循環(huán)操作,譬如替換、查找,應使用正則表達式,因為本身JavaScript的循環(huán)速度就比較慢,而正則表達式的操作是用C寫成的語言的API,性能很好。高級對象自定義高級對象和Date、RegExp對象在構(gòu)造時都會消耗大量時間。如果可以復用,應采用緩存的方式。DOM相關(guān)插入HTML很多人喜歡在JavaScript中使用document.wr