在使用 JavaScript 時,咱們會處理不少條件語句,這裏有 5 個技巧能夠幫助您編寫更好、更簡潔的條件語句。git
讓咱們看看下面的例子:github
// condition function test(fruit) { if (fruit == 'apple' || fruit == 'strawberry') { console.log('red'); } }
乍一看,上面的例子看起來不錯。然而,若是還有更多紅顏色的水果須要判斷呢,好比櫻桃和小紅莓,咱們要用更多的 || 來擴展這個表述嗎?數組
咱們能夠用 Array.includes 重寫上面的條件app
function test(fruit) { // extract conditions to array const redFruits = ['apple', 'strawberry', 'cherry', 'cranberries']; if (redFruits.includes(fruit)) { console.log('red'); } }
咱們將紅色水果(條件)提取到一個數組中。這樣作以後,代碼看起來更整潔。ide
讓咱們擴展前面的示例,以包含另外兩個條件:函數
看看上面的代碼,咱們有:post
我我的遵循的通常規則是,當發現無效條件時,提早返回。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 的例子:
讓咱們看看下面的例子,咱們想要基於顏色打印水果名稱:
上面的代碼彷佛沒有什麼問題,但我發現它至關冗長。一樣的結果能夠經過對象字面量和更簡潔的語法來實現:
或者,可使用 Map 來實現相同的結果:
Map 是 ES2015 之後可用的對象類型,容許您存儲鍵值對。
咱們應該禁止使用 switch 語句嗎?不要把本身侷限於此。就我我的而言,我儘量地使用對象字面量,可是我不會設置嚴格的規則來阻止它,使用對您的場景有意義的任何一個。
Todd Motto 有一篇文章深刻討論 switch 語句與對象字面量,你能夠在 這裏 閱讀。
對於上面的示例,咱們實際上能夠重構代碼,以使用 Array.filter
得到相同的結果。
總有不止一種方法能夠達到一樣的效果。咱們展現了 4 個相同效果的例子。編碼是有趣的!
最後一個技巧是關於使用新的(但不是很新)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
。