1. 可理解性
2. 直觀性
3. 可適應性
4. 可擴展性
5. 可調試性php
一、可讀性(代碼縮進和代碼註釋)
二、變量和函數命名算法
三、變量類型透明
(1)第一種方式是初始化,初始化爲一個特定的數據類型能夠很好的指明變量的類型;編程
//經過初始化指定變量類型 var found = false; //布爾型 var count = -1; //數字 var name = ""; //字符串 var person = null; //對象
(2)第二種方式是使用匈牙利標記法來指定變量的類型。匈牙利標記法在變量名以前加上一個或多個字符來表示數據類型。數組
//用於指定數據類型的匈牙利標記法 var bFound = false; //布爾型 var iCount = -1; //數字 var sName = ""; //字符串 var oPerson = null; //對象
(3)第三種方式是使用類型註釋。函數
//用於指定類型的類型註釋 var found /*:Boolean*/ = false; var count /*:int*/ = -1; var name /*:String*/ = ""; var person /*:Object*/ = null;
只要應用的某個部分過於依賴另外一部分,代碼就是耦合過緊,難以維護。性能
一、解耦HTML/JavaScript
二、解耦CSS/JavaScript測試
三、解耦應用邏輯/事件處理程序大數據
應用和業務邏輯之間鬆散耦合的幾條原則:優化
一、尊重對象全部權this
能夠經過如下方式爲對象建立新的功能
二、避免全局量
最多建立一個全局變量,讓其餘對象和函數存在其中。
var MyApplication = { name : "Nicholas", sayName : function(){ alert(this.name); } };
命名空間包括建立一個用於放置功能的對象。惟一的全局變量做爲一個容器,其中定義了其餘方法,用這種方式將功能組合在一塊兒的對象,叫作命名空間。命名空間有助於確保代碼能夠在同一頁面上與其餘代碼以無害的方式一塊兒工做。
三、避免與null進行比較
直接將值與null比較是使用過分的,而且經常因爲不充分的類型檢查致使錯誤。若是看到了與null比較的代碼,嘗試使用一下技術替換:
四、使用常量
將數據從應用邏輯分離出來的思想。能夠在不冒引入錯誤的風險的同時,就改變數據。以下例
function validate(value) { if(!value) { alert("Invalid value"); location.href = "/errors(invalid.php)"; } }
能夠經過將數據抽取出來變成單獨定義的常量的方式,將應用邏輯與數據修改隔離開來。修改以下:
var Constants = { INVALID_VALUE_MSG: "Invalid value", INVALID_VALUE_URL: "/errors/invalid.php" }; function validate(value) { if(!value) { alert(Constant.INVALID_VALUE_MSG); location.href = COnstant.INVALID_VALUE_URL; } }
關鍵在於將數據和使用它的邏輯進行分離。須要提取做爲常量的值大體有如下幾種狀況:
訪問全局變量老是比訪問局部變量慢。只要能減小花費在做用域上的時間,就能增長腳本的總體性能。
一、避免全局查找
function updateUI() { var imgs = document.getElementsByTagName("img"); for(var i=0, len=imgs.length; i<len; i++) { imgs[i].title = document.title + "image" + i; } var msg = document.getElementsById("msg"); msg.innerHTML = "Update complete." }
上述函數看起來徹底正常,可是它包含了三個對於全局document對象的引用。經過建立一個指向document對象的局部變量,就能夠經過限制一次全局查找來改進這個函數的性能。改進後的代碼以下:
function updateUI() { var doc = document; var imgs = doc.getElementsByTagName("img"); for(var i=0, len=imgs.length; i<len; i++) { imgs[i].title = doc.title + "image" + i; } var msg = doc.getElementsById("msg"); msg.innerHTML = "Update complete." }
二、避免with語句
with語句會建立本身的做用域,所以會增長其中執行的代碼的做用域的長度。
大多數狀況下,能夠是同局部變量完成相同的事情而不引入新的做用域。
function updateBody() { with(document.body) { alert(tagName); innerHTML = "Hello World!"; } }
以上代碼中的with語句讓document.body變得更容易使用,可是其實可使用局部變量達到相同的效果。
function updateBody() { var body = document.body; alert(body.tagName); body.innerHTML = "Hello World!"; }
一、避免沒必要要的屬性查找
二、優化循環
三、展開循環(能夠考慮一種叫作Duff裝置的技術)
當循環次數是肯定的,消除循環並使用屢次函數調用每每更快。以下循環代碼
for(var i=0; i<values.length; i++) { process(values[i]); }
能夠改成
process(values[0]); process(values[1]); process(values[2]);
//Duff裝置的基本概念是經過計算迭代的次數是否爲8的倍數將一個循環展開爲一系列語句。
var iterations = Math.ceil(values.length / 8); var startAt = values.length % 8; var i = 0; do{ switch(startAt) { case 0: process(value[i++]); case 7: process(value[i++]); case 6: process(value[i++]); case 5: process(value[i++]); case 4: process(value[i++]); case 3: process(value[i++]); case 2: process(value[i++]); case 1: process(value[i++]); } startAt = 0; }while(--iterations > 0);
Math.ceil()函數返回大於或等於一個給定數字的最小整數
Math.floor()函數返回小於或等於一個給定數字的最大整數
DUff裝置的實現是經過將values數組中的元素個數除以8來計算出循環須要進行多少次迭代的。而後使用取整的上限函數確保結果是整數。若是徹底根據8來進行迭代,可能會有一些不能被處理到的元素,這個數量保存在startAt變量中。首次執行該循環時,會檢查startAt變量看有須要多少次額外調用。那麼最開始的時候process()則只會被調用2次。在接下來的循環中,startAt被重置爲0,這樣以後的每次循環都會調用8次process()。展開循環能夠提高大數據及的處理速度。
四、避免雙重解釋
//某些代碼求值——避免!! eval("alert('Hello World!')"); //建立新函數——避免!! var sayHi = new Function("alert('Hello World!')"); //設置超時——避免!! setTimeout("alert('Hello World!')",500);
修改成
//某些代碼求值——已修正 alert('Hello World!'); //建立新函數——已修正 var sayHi = function(){ alert('Hello World!') }; //設置超時——已修正 setTimeout(function(){ alert('Hello World!'); },500);
五、性能其餘的注意事項
完成多個操做的單個語句要比完成單個操做的多個語句快。
一、多個變量的聲明
//4個語句——浪費! var count = 5; var color = "blue"; var values = [1,2,3]; var now = new Date();
修改成
var count = 5; color = "blue"; values = [1,2,3]; now = new Date();
二、插入迭代值
當使用迭代值(也就是在不一樣的位置進行增長或者減小的值)的時候,儘量使用合併語句。
var name = values[i]; i++;
例如以上代碼修改成
var name = values[i++];
三、使用數組和對象字面量
建立數組和對象的方法有兩種:使用構造函數或者是字面量。使用構造函數老是要用到更多的語句來插入元素或者定義屬性,而字面量能夠將這些操做在一個語句中完成。
//用4個語句建立和初始化數組——浪費 var values = new Array(); values[0] = 123; values[1] = 456; values[2] = 789; //只用一條語句建立和初始化數組 var values = [123, 456, 789];
只要有可能,儘可能使用數組和對象的字面量表達方式來消除沒必要要的語句。
一、最小化現場更新
二、使用innerHTML
三、使用事件代理
四、注意HTMLCollection
var images = document.getElementsByTagName("img"); i, len; for(i=0, length=images.length; i<len; i++) { //處理 }
修改成
var images = document.getElementsByTagName("img"); image, i, len; for(i=0, length=images.length; i<len; i++) { image = images[i]; //處理 }
編寫JavaScript的時候,必定要知道什麼時候返回HTMLCollection對象,這樣你就能夠最小化他們的訪問。發生一下狀況時會返回HTMLCollection對象:
當使用HTMLCOllection對象時,合理使用會極大提高代碼的執行速度。
一、構建過程
二、驗證
三、壓縮