優化JS 條件語句的5個技巧

在使用 JavaScript 時,咱們會處理不少條件語句,這裏有 5 個技巧能夠幫助您編寫更好、更簡潔的條件語句。git

一、對多個條件使用 Array.includes

讓咱們看看下面的例子:github

// condition
function test(fruit) {
  if (fruit == 'apple' || fruit == 'strawberry') {
    console.log('red');
  }
}

乍一看,上面的例子看起來不錯。然而,若是還有更多紅顏色的水果須要判斷呢,好比櫻桃和小紅莓,咱們要用更多的 || 來擴展這個表述嗎?數組

咱們能夠用 Array.includes 重寫上面的條件app

咱們將紅色水果(條件)提取到一個數組中。這樣作以後,代碼看起來更整潔。ide

二、更少的嵌套,儘早返回

讓咱們擴展前面的示例,以包含另外兩個條件:函數

  • 若是沒有提供水果(名稱),拋出錯誤。
  • 若是(紅色水果)數量超過 10 個,接受並打印。

看看上面的代碼,咱們有:post

  • 1 組過濾無效條件的 if/else 語句
  • 3層的 if 嵌套語句(條件 一、2 和 3)

我我的遵循的通常規則是,當發現無效條件時,提早返回。ui

這樣,咱們就少了一層嵌套。這種編碼風格很好,尤爲是當你有很長的 if 語句時(想象一下,你須要滾動到最底部才能知道還有一個 else 語句,這並不酷)。編碼

經過反轉條件和提前返回,咱們能夠進一步減小嵌套。看看下面的條件 2,咱們是怎麼作的:spa

經過反轉條件 2 的條件,咱們的代碼如今沒有嵌套語句。當咱們有很長的邏輯要處理時,這種技術是有用的,當一個條件沒有知足時,咱們想要中止進一步的處理。

然而,這並非嚴格的規則。問問本身,這個版本(沒有嵌套)是否比前一個版本(嵌套的條件 2)更好、更易讀?

對於我來講,我將把它保留爲之前的版本(條件 2 和嵌套)。這是由於:

  • 代碼簡短而直接,若是嵌套,代碼就更清晰了
  • 反轉條件可能會致使更多的思考過程(增長認知負擔)

所以,老是以更少的嵌套及儘早返回爲目標,但不要過分。若是你感興趣的話,StackOverflow 有一篇相關的文章討論了這個話題:

三、使用默認的函數參數和解構

我想下面的代碼對您來講可能很熟悉,咱們在使用 JavaScript 時老是須要檢查 null 或 undefined 值並分配默認值:

事實上,咱們能夠經過指定默認的函數參數來消除變量 q

更簡單和直觀,不是嗎?請注意,每一個參數均可以有本身的默認函數參數。例如,咱們也能夠爲 fruit 賦值:function test(fruit = 'unknown', quantity = 1)

若是咱們的 fruit 是一個對象呢?咱們能夠指定默認參數嗎?

請看上面的示例,若是 fruit.name 是可用的,咱們將打印該水果名稱,不然咱們將打印 unknown。咱們能夠避免使用與默認函數參數和解構對條件 fruit && fruit.name 進行檢查。

由於咱們只須要水果中的屬性 name,因此咱們可使用 {name} 來解構,而後咱們能夠在代碼中使用 name 做爲變量,而不是 fruit.name

咱們還將空對象 {} 指定爲默認值。若是咱們不這樣作,當執行 test(undefined),不能解構 undefined 或 null 的屬性名時,您將會獲得錯誤。由於在 undefined中沒有 name 屬性。

若是您不介意使用第三方庫,有一些方法能夠減小 null 檢查:

  • 使用 Lodash 的 get 函數
  • 使用 Facebook 的開源庫 idx(以及 Babeljs)

這是使用 Lodash 的例子:

四、選擇 Map 或對象字面量,而不是 Switch 語句

讓咱們看看下面的例子,咱們想要基於顏色打印水果名稱:

上面的代碼彷佛沒有什麼問題,但我發現它至關冗長。一樣的結果能夠經過對象字面量和更簡潔的語法來實現:

或者,可使用 Map 來實現相同的結果:

Map 是 ES2015 之後可用的對象類型,容許您存儲鍵值對。

咱們應該禁止使用 switch 語句嗎?不要把本身侷限於此。就我我的而言,我儘量地使用對象字面量,可是我不會設置嚴格的規則來阻止它,使用對您的場景有意義的任何一個。

Todd Motto 有一篇文章深刻討論 switch 語句與對象字面量,你能夠在 這裏 閱讀。

TL;DR; 重構的語法

對於上面的示例,咱們實際上能夠重構代碼,以使用 Array.filter 得到相同的結果。

總有不止一種方法能夠達到一樣的效果。咱們展現了 4 個相同效果的例子。編碼是有趣的!

五、全部或部分使用 Array.every & Array.some 的條件

最後一個技巧是關於使用新的(但不是很新)Javascript 數組函數來減小代碼行。看看下面的代碼,咱們想檢查全部的水果是否都是紅色的:

代碼太長了!咱們能夠用 Array.every 來減小行數:

const fruits = [
    { name: 'apple', color: 'red' },
    { name: 'banana', color: 'yellow' },
    { name: 'grape', color: 'purple' }
  ];
 
function test() {
  // condition: short way, all fruits must be red
  const isAllRed = fruits.every(f => f.color == 'red');
 
  console.log(isAllRed); // false

如今乾淨多了,對吧?相似地,若是咱們想用一行代碼來判斷任何一個水果是否爲紅色,咱們可使用 Array.some

相關文章
相關標籤/搜索