高效率JavaScript編寫技巧
1.JavaScript是唯一一個對代碼體積要求越小越好的語言,因此我們可以通過一些工具來精簡和壓縮JavaScript代碼,如JSMin、Packer、YUICompressor等。這些工具會將局部變量的名字替換成很短的變量名,例如將parseFloat()替換成a()。因此我們在編寫JavaScript代碼時,應將每一個全局變量都映射到一個局部變量,如var parseFloat = parseFloat;
2.通過JSLint來檢測你編寫的JavaScript,可以發現里面隱藏的很多問題。JSLint是一個JavaScript驗證工具(非開源),可以掃描JavaScript源代碼來查找問題。如果JSLint發現一 個問題,JSLint就會顯示描述這個問題的消息,并指出錯誤在源代碼中的大致位置。
3.我們在寫JavaScript的時候經常需要遍歷一個數組,代碼如下:
for (var i=0;i<array.length;i++){ //do something }
JavaScript的成員變量是運行時確定的,這就導致每一次循環都需要查找數組length屬性,因此我們可以增加一個變量來存儲數組大小:
var l = array.length; for (var i=0;i<l;i++){ //do something }
這樣看起來已經優化得不錯了,但實際上我們可以做得更好:
var i=array.length; while(i--){ //do something }
這是因為這兩行代碼轉換成匯編時,while語句所需的指令更少,在這里就不展開說明了,大家有興趣可以去研究下匯編。
4.由于JavaScript中任何人都可以修改或添加Object.prototype中的屬性,因此我們在遍歷一個對象的屬性時,應先使用hasOwnProperty進行判斷,避免遍歷整個原型鏈,影響效率。如:
for (var key in obj) { if (obj.hasOwnProperty(key)) { //do something } }
5.在使用undefined的時候先定義一個局部變量undefined
var checkVal = function(val) { var undefined; return val !== undefined; };上述代碼中,如果沒有提前定義局部變量,直接使用全局變量undefined進行判斷,如果第三方在別的地方定義了一個全局變量undefined=3將導致結果錯誤。
6.在將一個非字符串類型的變量轉換成字符串類型時,可以直接使用
var str = (i + "").replace(...);
這個地方如果使用String(i)會慢很多。
7.定義數組的時候如果不需要使用數組類的排序等方法,只是進行一般的賦值和訪問,應該直接寫
var array = [];而不是
var array = new Array();
同理,在創建對象的時候,應該直接寫var obj = {},而不是var obj = new Object()
這樣寫有三個原因:a.效率更高,因為Array可以被重載而[]不行,運行的時候需要先查找Array對應的函數。
b.這樣寫更短
c.Array有可能會被第三方寫的全局變量覆蓋,存在潛在沖突。
具體大家可以參見這兩篇帖子:
(請注意是[],不是{},之前寫錯了,很抱歉,感謝lanyotechcs的指正)
8.使用jQuery時,對同一個對象執行多個函數盡量放在同一行代碼里,例如:
$("p.neat").addClass("ohmy").show("slow");而不是
$("p.neat").addClass("ohmy"); $("p.neat").show("slow");這樣代碼會更簡潔,最終得到的js文件會更小
9.在需要定義一系列變量時,使用逗號分隔:
var obj1 = {}, obj2 = {}, obj3 = {};而不是
var obj1 = {}; var obj2 = {}; var obj3 = {};
同樣,這會使最終得到的js文件更小。
以上介紹的技巧中有不少純粹是為了減少字符個數,不過不要覺得省這幾個字符沒有意義,當你的代碼成千上萬行時,注意這些這能讓你的js加載速度快很多。其余的技巧還有使用DocumentFragment優化多次append,使用firstChild和nextSibling代替childNodes遍歷dom元素等。
具體大家可以參考這篇博客:http://www.nowamagic.net/librarys/veda/detail/363
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!