此篇會介紹 JS 中常用技巧,將 &&、|| 運用「短路求值」的方式來提升 coding 效率。
          
        
      
        
            快速複習一下邏輯運算子:「當 AND 的第一個運算數的值為 false 時,其結果必定為 false;當 OR 的第一個運算數為 true 時,最後結果必定為 true。」
           
            不熟悉 真值(truthy)、假值(falsy) 可以參考這篇文章。
           
口訣
&& 左邊是 假值(falsy) 則不會執行右邊。 
|| 左邊是 真值(truthy) 則不會執行右邊。 
            下方範例運用 &&、|| 特性,演示將左右兩邊的 表達式 達到和 if 判斷式一樣的效果。
           
e.g. 使用 || 來實作賦予預設值功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   | let a = null;
 
  let b = a || 1; 
 
  if (!a) {   let b = a; } else {   let b = 1; }
 
  let b = a ? a : 1;
 
   | 
 
e.g. && 透過判斷 真假值 來決定是否執行表達式(也可以執行函式)
1 2 3 4 5 6 7 8 9 10
   | let person1 = {   name: 'kent',   age: 18 }
 
  person1.age >= 18 && console.log(`${person1.name} 已成年`); 
 
  if (person1.age >= 18) console.log(`${person1.name} 已成年`);
  | 
 
e.g. 判斷物件屬性是否存在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
   | let school = {   info: {     student: {       name: 'kent',       age: 18,     },   }, };
 
  let name = obj.info.teacher && obj.info.teacher.name; 
 
  let name = obj.info.teacher.name; 
  if (obj.info.teacher) {   let name = obj.info.teacher.name; }
  | 
 
短路求值 tips
短路求值 使用表達式的情況下,只適用於沒有 else 的判斷式,需要有 else 可以使用 三元運算子。 
短路求值 不能帶 return。 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
   | function isAdult(age) {    
       age && return '資料錯誤'; 
       if (!age) {     return '資料錯誤';   }
 
       let res      res = (age >= 18) && '已成年';
       res = age >= 18 ? '已成年' : '未成年';
    return res; }
  isAdult(null);   isAdult(18);  isAdult(17);  
  | 
 
詬病「不夠嚴謹」
            👨💻 當變數為 false、0 或空字串 "" 其中之一時, 則布林值也會轉型為假值 (falsy),對於判斷變數是否使用過來說是相當不方便的一件事。
           
e.g. 判斷某個變數是否使用過,有的話就作初始化。1 2 3 4 5 6 7 8 9 10
   | let time = 1 - 1;
 
  if (time) {      time = null; }
 
  time = time && null;
   | 
 
e.g. 假設有一間銀行,發給新辦用戶 100 摳,結果連舊客戶都發了...1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | let person1 = {   name: 'kent',   age: 18,   wallet: 0 };
  let person2 = {   name: 'clark',   age: 20,   wallet: null };
  person1.wallet || {person1, ...{wallet: 100}};  person2.wallet || {person2, ...{wallet: 100}}; 
 
 
  | 
 

            javascript 後來增加了一種 空值合併運算子 用來解決不夠嚴謹的問題。
           
conclusion

reference