1. 程式人生 > 程式設計 >JavaScript中條件語句的優化技巧總結

JavaScript中條件語句的優化技巧總結

對多個條件使用 Array.includes

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

上面的例子看起來不錯。然而,如果還有更多紅顏色的水果需要判斷呢,比如櫻桃和小紅莓,我們要用更多的 ||來擴充套件這個表述嗎?

我們可以用 Array.includes 重寫上面的條件!

function test(fruit) {
 const redFruits = ['apple','strawberry','cherry','cranberries'];
 if (redFruits.includes(fruit)) {
 console.log('red');
 }
}

我們將條件提取到一個數組中。這樣做之後,程式碼看起來更整潔。

更少的巢狀,儘早返回

擴充套件前面的示例,以包含另外兩個條件:

如果沒有提供水果(名稱),丟擲錯誤。

如果(紅色水果)數量超過 10 個,接受並列印。

看看上面的程式碼,我們有:

1 組過濾無效條件的 if/else 語句

3層的 if 巢狀語句(條件 1、2 和 3)

遵循的一般規則是,當發現無效條件時,提前返回。

/_ return early when invalid conditions found _/
function test(fruit,quantity) {
 const redFruits = ['apple','cranberries'];

 // condition 1: throw error early
 if (!fruit) throw new Error('No fruit!');

 // condition 2: must be red
 if (redFruits.includes(fruit)) {
console.log('red');

 // condition 3: must be big quantity
 if (quantity > 10) {
  console.log('big quantity');
 }
 }
}

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

通過反轉條件和提早返回,我們可以進一步減少巢狀。看看下面的條件 2,我們是怎麼做的:

/_ return early when invalid conditions found _/
 
function test(fruit,'cranberries'];
 
 if (!fruit) throw new Error('No fruit!'); // condition 1: throw error early
 if (!redFruits.includes(fruit)) return; // condition 2: stop when fruit is not red
 
 console.log('red');
 
 // condition 3: must be big quantity
 if (quantity > 10) {
  console.log('big quantity');
 }
}

通過反轉條件 2 的條件,我們的程式碼現在沒有巢狀語句。當我們有很長的邏輯要處理時,這種技術是有用的,當一個條件沒有滿足時,我們想要停止進一步的處理。

然而,這並不是嚴格的規則。問問自己,這個版本(沒有巢狀)是否比前一個版本(巢狀的條件 2)更好、更易讀?

對於我來說,我將把它保留為以前的版本(條件 2 和巢狀)。這是因為:
程式碼簡短而直接,如果巢狀,程式碼就更清晰了,反轉條件可能會導致更多的思考過程(增加認知負擔)!

因此,總是以更少的巢狀及儘早返回為目標,但不要過度。

使用預設的函式引數和解構

在使用 JavaScript 時總是需要檢查 null 或 undefined 值並分配預設值:

function test(fruit,quantity) {
 if (!fruit) return;
 const q = quantity || 1; 
}

//test results
test('banana');
test('apple',2);

事實上,可以通過指定預設的函式引數來消除變數 q。

function test(fruit,quantity = 1) {
 if (!fruit) return;
}

//test results
test('banana');
test('apple',2);

請注意,每個引數都可以有自己的預設函式引數。例如,我們也可以為 fruit 賦值:function test(fruit = 'unknown', quantity = 1)。

如果我們的 fruit 是一個物件:

function test(fruit) {
 if (fruit && fruit.name) {
  console.log (fruit.name);
 } else {
  console.log('unknown');
 }
}

//test results
test(undefined); // unknown
test({ }); // unknown
test({ name: 'apple',color: 'red' }); // apple

如果 fruit.name 是可用的,我們將列印該水果名稱,否則我們將列印 unknown。我們可以避免使用與預設函式引數和解構對條件 fruit && fruit.name進行檢查。

function test({name} = {}) {
 console.log (name || 'unknown');
}

//test results
test(undefined); // unknown
test({ }); // unknown
test({ name: 'apple',color: 'red' }); // apple

因為我們只需要水果中的屬性 name,所以我們可以使用 {name} 來解構,然後我們可以在程式碼中使用 name 作為變數,而不是 fruit.name。

我們還將空物件 {} 指定為預設值。如果我們不這樣做,當執行 test(undefined),不能解構 undefined 或 null 的屬性名時,您將會得到錯誤。因為在 undefined中沒有 name 屬性。

選擇 Map 或物件字面量,而不是 Switch 語句

我們想要基於顏色列印水果名稱:

function test(color) {
 // use switch case to find fruits in color
 switch (color) {
  case 'red':
   return ['apple','strawberry'];
  case 'yellow':
   return ['banana','pineapple'];
  case 'purple':
   return ['grape','plum'];
  default:
   return [];
 }
}
 
//test results
test(null); // []
test('yellow'); // ['banana','pineapple']

上面的程式碼似乎沒有什麼問題,但發現它相當冗長。同樣的結果可以通過物件字面量和更簡潔的語法來實現:

const fruitColor = {
  red: ['apple','strawberry'],yellow: ['banana','pineapple'],purple: ['grape','plum']
 };
 
function test(color) {
 return fruitColor[color] || [];
}

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

const fruitColor = new Map()
  .set('red',['apple','strawberry'])
  .set('yellow',['banana','pineapple'])
  .set('purple',['grape','plum']);
 
function test(color) {
 return fruitColor.get(color) || [];
}

Map 是 ES2015 以後可用的物件型別,允許您儲存鍵值對。

對於上面的示例,我們實際上可以重構程式碼,以使用 Array.filter 獲得相同的結果。

const fruits = [
  { name: 'apple',color: 'red' },{ name: 'strawberry',{ name: 'banana',color: 'yellow' },{ name: 'pineapple',{ name: 'grape',color: 'purple' },{ name: 'plum',color: 'purple' }
];

function test(color) {
 // use Array filter to find fruits in color
 
 return fruits.filter(f => f.color == color);
}

總有不止一種方法可以達到同樣的效果。展示了 4 個相同效果的例子。

所有或部分使用 Array.every & Array.some 的條件

使用新的Javascript 陣列函式來減少程式碼行。看看下面的程式碼,我們想檢查所有的水果是否都是紅色的:

const fruits = [
  { name: 'apple',color: 'purple' }
 ];
 
function test() {
 let isAllRed = true;
 
 // condition: all fruits must be red
 for (let f of fruits) {
  if (!isAllRed) break;
  isAllRed = (f.color == 'red');
 }
 
 console.log(isAllRed); // false
}

程式碼太長了!我們可以用 Array.every 來減少行數:

const fruits = [
  { name: 'apple',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。

const fruits = [
  { name: 'apple',color: 'purple' }
];
 
function test() {
 // condition: if any fruit is red
 const isAnyRed = fruits.some(f => f.color == 'red');
 console.log(isAnyRed); // true
}

到此這篇關於JavaScript中條件語句的優化技巧的文章就介紹到這了,更多相關JS條件語句優化技巧內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!