JavaScript的性能問題(摘自Ajax+Lucence構建搜索引擎)
發(fā)表時間: 2006年12月28日
JavaScript的性能問題
(摘自《Ajax+Lucence構建搜索引擎》)
javascript是一種解釋型語言,性能無法達到和C、C++等編譯語言的水平,但還是有一些方法來改進。
1、循環(huán)
JavaScript中的循環(huán)方式有for(;;)、while()、for(in)3種。其中for(in)的效率極差,因為for(in)執(zhí)行過程中需要查詢散列鍵。for(;;)和while()比較,while循環(huán)的效率要優(yōu)于for(;;)。
2、局部變量和全局變量
局部變量的訪問速度更快,因為全局變量其實是全局對象的成員,而局部變量是放在函數(shù)的堆棧當中的。
3、不使用eval
使用eval函數(shù)相當于在運行時再次調(diào)用解釋引擎對內(nèi)容進行解釋運行
4、減少對象查找
因為JavaScript的特性,對于類是表達式a.b.c.d.e,需要至少4次查詢操作。首先檢查a在檢查a中的b,如此往下。應盡量避免出現(xiàn)這樣的表達式、可以利用局部變量把要訪問的最終結果放入一個臨時的位置進行查詢。
這一點可以和循環(huán)結合起來,例如對一個數(shù)組可以先取他的長度 var len = a.length
##其實java 中對于列表的循環(huán)也是先取size給一個臨時變量
5、字符串連接
如果是追加字符串,最好使用s+=anotherStr操作,而不要使用s=s+""
但是如果要連接多個字符串,應該少用+= 例如:
- s+=a;
- s+=b;
- s+=c;
應該寫成 s+=a+b+c;
如果是收集字符串,比如收集字符串,最好使用一個緩存實現(xiàn)。具體的實現(xiàn)思路就是使用Javascript數(shù)組來收集每個字符串,最好使用join方法將這些字符串連接起來,如下面代碼所示:
- var buf = new Array();
- for(var i=0;i<100;i++){
- buf.push(i.toString());
- }
- var all = buf.join("");
6、類型轉換
類型轉換是JavaScript編程中容易出錯的地方,因為JavaScript是動態(tài)類型語言,即弱類型語言,不能指定變量的具體類型。
(1)把數(shù)字轉換成字符串,應用""+1,雖然比較別扭一點、但效率是最高的
(""+)>String()>.toString()>new String()
String()屬于內(nèi)部函數(shù),所以速度很快,toString()要查詢原型中的函數(shù),new String()用于返回一個精確的副本。
(2)浮點數(shù)轉換成整型 parseInt()用于將字符串轉換成數(shù)字,應該使用Math.floor()或者Math.round()來實現(xiàn)浮點型和整型之間的轉換。
(3) 對于自定義的對象,如果定義了toString()方法進行類型轉換的話,推薦顯示調(diào)用toString()
7、使用直接量
以往我們都使用new Array(parm,parm1..)等形式,對于直接量的解釋JavaScript支持使用[param,param1....]來直接表達一個數(shù)組。
前一種方式調(diào)用Array內(nèi)部構造器,而后一種方式是解釋引擎直接解釋的,故執(zhí)行速度要略微快一點。同理var foo = {}比 var foo = new Object()快,var reg=/..../比 var reg=new RegExp()執(zhí)行的快些。
8、字符串遍歷
優(yōu)先使用正則表達式
9、高級對象
自定義高級對象和Date、RegExp等對象構造時會消耗大量的時間和資源
10、插入HTML
document.write效率較低,innerHTML效率較高
11、下標查詢
使用直接的下標查找一個對象的屬性比通過.name方法要快很多
12、創(chuàng)建DOM節(jié)點
通常我們可能會使用字符串直接寫HTML語句來創(chuàng)建節(jié)點,實際上這樣有如下缺點:
無法保證代碼的有效性;
字符串操作效率低。
應該使用documeng.createElement()方法。如果存在現(xiàn)成的樣板節(jié)點,應該使用cloneNode()方法。