讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議26:小心if嵌套的思維陷阱 >

建議26:小心if嵌套的思維陷阱

人的思維是非常複雜的,這在一定程度上會增加if結構嵌套的複雜性。假設有4個條件,只有當這些條件全部成立時,才允許執行某件事情。遵循人的一般思維習慣,在檢測這些條件時,常常會沿用下面這種結構嵌套:


if(a){

if(b){

if(c){

if(d){

alert("所有條件都成立!");

}

else{

alert("條件d不成立!");

}

}

else{

alert("條件c不成立!");

}

}

else{

alert("條件b不成立!");

}

}

else{

alert("條件a不成立!");

}


從思維的方向性上來考慮,這種結構嵌套並沒有錯誤,使用下面這個if結構來表示更為簡單。


if(a&&b&&c&&d){

alert("所有條件都成立!");

}


從設計時的本意來考慮:使用if語句逐個驗證每個條件的合法性,並且對某個條件是否成立進行提示,以方便跟蹤每個條件。但是,如果使用了上面的if結構多重嵌套,就會出現另一種可能:a條件不成立,程序會自動退出整個嵌套結構,而不管b、c和d的條件是否成立。這種「武斷」很容易給測試帶來「傷害」。如果核心的處理過程包含多條語句,或者出錯的情況處理更為複雜,層層包裹的if結構會使代碼嵌套過深,難以編輯。

為避免上述情況的發生,一般採取排除法,即對每個條件進行排除,條件全部成立再執行特定的操作。為了能夠把條件有機地聯繫在一起,這裡使用了一個布爾型變量作為鉤子把每個if條件結構串在一起。


var t=true;//初始化行為變量為true

if(!a){

alert("條件a不成立!");

t=false;

}

if(!b){

alert("條件b不成立!");

t=false;

}

if(!c){

alert("條件c不成立!");

t=false;

}

if(!d){

alert("條件d不成立!");

t=false;

}

if(t){

alert("所有條件都成立!");

}


排除法有效地避免了條件結構的多重嵌套,並且更加符合人的思維模式。當然,這種設計方法也存在一定的局限性,一旦發生錯誤,就要放棄後面的操作。如果僅為了檢查某個值的合法性,也就無所謂了。如果為了改變變量值和數據操作等,那麼直接放棄就會導致後面的數據操作無法進行,為了防止此類問題的發生,不妨再設計一個標誌變量來跟蹤整個操作行為。