【筆記】改善javascript程序的188個建議27-33

27、小心if隱藏的BUG


(1)if(a = 1){...}
把比較運算符錯寫爲賦值運算符。
爲了防止出現這樣低級令人討厭的錯誤,建議在條件表達式的比較運算中,把常量寫在左側,把變量寫在右側。這樣在你寫錯的時候,會報錯。
if( 1 == a){ ... }


(2)在if之後添加了分號(;)
if(a==1);{
...
}




28、使用查表法提高條件檢測的性能
當有大量離散值需要測試時,使用if和switch都比使用查表法要慢得多。
比如:

switch(value):
		case 0 :
			return result0;
		case 1 : 
			return result1;
		case 2 : 
			return result2;
		case 3 : 
			return result3;
		case 4 : 
			return result4;
		case 5 : 
			return result5;
		case 6 : 
			return result6;
		case 7 : 
			return result7;
		case 8 : 
			return result8;
		case 9 : 
			return result9;
		default : 
			return result10;
	}


改爲:
var results = [result0,result1,result2,result3,result4,result5,result6,result7,result8,result9,result10];
	return results[value];




使用查表法時,必須完全消除所有條件判斷。操作轉換成一個數組項查詢或一個對象成員查詢。使用查表法的一個主要優點:由於沒有條件判斷,當候選值數量增加時,基本上不會增加額外的性能開銷。




29、準確使用循環體
在js提供的四種循環類型中,只有for in循環執行速度比其他循環明顯要慢。
除非需要對數目不詳的對象屬性進行操作,否則避免使用for in循環。




30、使用遞歸模式
遞歸函數會受到瀏覽器調用棧大小的限制。
當使用了太多的遞歸,超過最大調用棧尺寸時,瀏覽器會彈出錯誤信息。
try{
		recurse();
	}catch(ex){
		alert('error info');
	}


當出現調用棧尺寸限制的問題時,第一步定位在代碼中的遞歸實例上。
兩種遞歸方式:
(1)直接遞歸:
function r(){
		r();
	}
	r();




(2)精巧模式:
function a(){
		b();
	}
	function b(){
		a();
	}




a();


常見的棧溢出原因是一個不正確的終止條件。如果條件是正確的,那麼算法包含了太多層遞歸,爲了能夠安全滴在瀏覽器中運行,應改用迭代、製表或混合模式。




31、使用迭代
使用迭代代替遞歸,速度會慢點,但是可以避免棧溢出錯誤。


32、使用製表(記憶遞歸)
比如,階乘可以改爲:
function menfactorial(n){
		if(!memfactorial.cache){
			memfactorial.cache = {
				'0':1,
				'1':1
			};
		}
		if(!menfactorial.cache.hasOwnProperty(n)){
			memfactorial.cache[n] = n*memfactorial(n-1);
		}
		return memfactorial.cache[n];
	}




使用製表法設計階乘函數的關鍵是簡歷一個緩存對象,此對象位於函數內部,其中預製了兩個最簡單的階乘,在計算階乘之前,先檢查緩存中是否已經存在相應的計算結果。沒有對應的緩衝值說明這是第一次計算此數值的階乘,計算完成之後,結果存入緩存中,供以後使用。




33、優化循環結構
(1)優化結構
(2)避免不必要的重複操作
不需要變化的東西,比如數組的聲明等,可以放在循環體外,不用每次都聲明。
(3)妥善定義循環變量




發佈了74 篇原創文章 · 獲贊 22 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章