JavaScript 條件運算式深入學習

來源:互聯網
上載者:User

   js的條件運算式和其他語言一樣,都採用了if else和switch這兩種。由於不同的瀏覽器對流程式控制制進行了不同的最佳化。因此這兩種在效能上是沒有什麼區別的,主要還是根據需求進行分析和選擇。

  如果條件較小的話選用if else比較合適。

  相反,條件數量較大的話,就建議選用switch。

  一般來說,if else適用於兩個離散的值或者不同的範圍。如果判斷多個離散值,使用switch更加合適。

  在大多數的情況下switch比if else啟動並執行更加快。

  恰當的使用 if 與 switch

  當我們使用到條件運算式的時候,無論if else還是switch,都應確保下面3哥目標的基本實現:

  精確表現事物的內在、固有的邏輯關係。不能為了結構而破壞。

  最佳化邏輯的執行效率。執行效率是程式設計的重要目標,不能為了省事而隨意的消耗資源。

  簡化代碼的結構層次,使代碼更加容易的閱讀。

  適合使用if else的情況:

  具有複雜的邏輯關係。

  運算式的值具有線性特徵,如對連續的區間值進行判斷。

  運算式的值是動態。

  測試任意類型的資料。

  適合使用switch的情況:

  每句運算式的值。這種是可以期望的、平行邏輯關係的。

  運算式的值具有離散性,不具有線性非連續的區間值。

  運算式的值是固定的,不是動態變化的。

  運算式的值是有限的,而不是無限的,一般情況下運算式應該比較少。

  運算式的值一般為整數、字串類型的資料。

  例如,對學生的分數進行不同的判斷,這個時候使用if else就比較合適,因為這種情況,運算式的值是連續的線性判斷。

  if (socre < 60) {

  alert('不及格');

  } else if (socre > 60 && socre <= 85) {

  alert('良好');

  } else if (socre > 86) {

  alert('優秀');

  }

  而判斷性別之類的使用switch就比較合適。

  switch (sex) {

  case '男':

  alert('先生');

  break;

  case '女':

  alert('女士');

  break;

  }

  最佳化 if 邏輯

  邏輯順序體現了人的思維的條理和嚴密性。合理的順序可以提升解決問題的品質,相反,混亂的順序和容易導致各種錯誤的發生。

  人們考慮的東西到時候,都會把最可能發生的情況先做好準備。最佳化if邏輯的時候也可以這樣想:把最可能出現的條件放在前面,把最不可能出現的條件放在後面,這樣程式執行時總會按照帶啊名的先後順序逐一檢測所有的條件,知道發現匹配的條件才會停止繼續檢測。

  if的最佳化目標:最小化找到分支之前所判斷條件體的數量。if最佳化的方法:將最常見的條件放在首位。

  if (i < 5) {

  // 執行一些代碼

  } else if (i > 5 && i < 10) {

  // 執行一些代碼

  } else {

  // 執行一些代碼

  }

  例如上面這個例子,只有在i值經常出現小於5的時候是最佳化的。如果i值經常大於或者等於10的話,那麼在進入正確的分支之前,就必須兩次運算條件體,導致運算式的平均運算時間增加。if中的條件體應該總是按照從最大機率到最小機率排列,以保證理論速度最快。

  if 嵌套的思維陷阱

  在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結構會使代碼嵌套過深,難以編輯。

  為瞭解決上面的問題,一般來說會採用排除法,即對每一個條件進行排除,條件全部成立在執行特定的操作。

  var t = true;

  if (!a) {

  t = false;

  }

  if (!b) {

  t = false;

  }

  if (!c) {

  t = false;

  }

  if (!d) {

  t = false;

  }

  if (t) {

  // 條件全部符合要求

  }

  排除法有效避免了上面所說的條件結構的多重嵌套問題,且更加符合人的思維模式。當然,也存在一些局限性,一旦發生錯誤的話,就要放棄後面的操作。如果想要防止這類問題發生,可以在設計一個標示變數來跟蹤整個操作行為。

  容易在 if 裡犯的小錯誤

  不知道大家有木有犯過下面這種錯誤:

  // 第一種

  if (i = 1) {

  alert(i);

  }

  // 第二種

  if (i = 1) ;

  {

  alert(i);

  }

  第一種情況是,有時候會把比較運算=== or ==符錯寫為賦值運算子=。而且這種錯誤一般很難發現,由於它是一個合法的運算式,不會導致編譯錯誤。

  最後就把常量放在左邊,把變數放在右邊,這樣寫的話,就算你把=當作了===來使用也會報錯。

  if (1 === i) {

  alert(i);

  }

  第二種是,在if的括弧後面加了個分號,導致整個結構的邏輯就發生了變化。我們應該牢記條件運算式之後不允許添加分化,最後就通過把大括弧與條件運算式寫在一行來防止犯錯。

  if (i) {

  alert(i);

  }

  編寫 switch 要注意的地方

  千萬不要忘記在每一個case語句後面放一個break語句。也可以放一個return或者throw。

  防止 switch 貫穿

  在switch語句中,除非明確地中斷流程,否則每次條件判斷後就會貫穿到下一個case條件。在執行switch語句中,js會先計算switch條件的值,然後使用這個值與每個case中的值進行比較,如果相同則執列標籤下的語句。在執行的時候如果遇到跳躍陳述式,就會跳出switch結構,否則就會按照順序執行下去,知道switch語句末尾。如果沒有匹配的case的話就會執行default的語句。

  switch (a = 3) {

  case 3 - 2:

  alert(1);

  break;

  case 1 + 1:

  alert(2);

  break;

  }

  上面的switch語句中,case語句只是指明了想要執行代碼的起點,並沒有指明終點,如果沒有在case從句中添加break語句,則會發生連續貫穿現象,從而忽略後面的case從句,這樣就會造成switch結構的邏輯混亂。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.