--- title: ES6的語法糖 & 新增語法 tags: 前端沒有盡頭的牆外調查, 六角 date: 20220423 image: --- # ES6的語法糖 & 新增語法 ## 什麼是語法糖? 語法糖 : 語法糖意指更加簡潔流暢、更好理解的語法,不會影響運作,邏輯與當前JS一致。 參考資料 : [Day20【ES6 小筆記】什麼是「語法糖」哩?](https://ithelp.ithome.com.tw/articles/10218664) --- > Q : **請問箭頭函式是縮寫嗎?**[color=green] > > A : 箭頭函式不是語法糖,而是新增語法。 傳統函式 : ```jsx= const obj={ myName:'物件', fn : function(){ return this.myName; } } console.log(obj.fn()) //物件 ``` 箭頭函式: tips : 但其實如果有用到this就不能用箭頭函式 ```jsx= const obj={ myName:'物件', fn : ()=> { return this.myName; } } console.log(obj.fn()) //undefined ``` > Q : **請問let,const是語法糖還是新增語法?**[color=green] > > A : let , const是新增語法。 因為 `let` 的作用域只存在於 block 之中,超出 block 之外就等於沒有宣告這個變數。反之, `var` 的作用域則不在 block 的限制內,而是在 function 裡面。 ```jsx= { let a = 0; var b = 0; }; console.log(b) // 0 console.log(a) // is not defined ``` ### 物件字面值 物件內的函式( **縮寫形式** ): ```jsx= const obj3={ myName:'物件', fn (){ return this.myName; } } console.log(obj.fn()) //物件 ``` 物件內的變數: ```jsx= const myName = '小明'; const person = { //縮寫前 myName='小明'; //縮寫後 myName : myName;(x) myName (o) } consoel.log(person) ``` ### 展開 不同陣列合併 ```jsx= const groupA =['小明','杰倫','阿姨']; const groupB =['老爸','老媽']; //合併前 const groupAll = groupA.concat(groupB); //合併後 const groupAll = [...groupA,...groupB] console.log(groupAll) // ['小明','杰倫','阿姨','老爸','老媽'] ``` 物件擴展 : 新增一個物件包含新方法,同時加入原有的方法。 > Q : **請問 methods.fn3();可以動嗎?**[color=green] > A : 可以動。 ```jsx= const methods={ fn1(){ console.log(1); }, fn2(){ console.log(1); }, } const methods2 = methods; //在 methods2 新增一個fn3 methods2.fn3 = function(){ console.log(3); } methods.fn3(); console.log(methods === methods2)//true ``` 那如果我希望 `methods2` 的變動不要影響 `methods`呢? ```jsx= const methods={ fn1(){ console.log(1); }, fn2(){ console.log(1); }, } const methods2 = { ...methods, //在 methods2 新增一個fn3 fn3(){ console.log(3) } } console.log(methods === methods2)//false ``` ### 解構 ( 把值取出重新組合並解開,便於把內容拆解出來 ) ```jsx= // 原始 const casper = people.casper; // 解構 const { casper } = people; // 取多筆變數 const { casper , ray } = people; console.log(casper,ray) ``` ![](https://i.imgur.com/TvLop1t.png) ## 什麼是新增語法? (箭頭函式、let & const) 與語法糖相反,新增語法會影響當前JS的運作。 以下這篇文章也有提到「箭頭函式」不是語法糖,以及使用 debounce 時使用箭頭函式觸發的雷點 XD - [Vue 中使用 debounce 防止前端瘋狂發送請求](https://khiav223577.github.io/blog/2018/04/09/Vue-%E4%B8%AD%E4%BD%BF%E7%94%A8-debounce-%E9%98%B2%E6%AD%A2%E5%89%8D%E7%AB%AF%E7%98%8B%E7%8B%82%E7%99%BC%E9%80%81%E8%AB%8B%E6%B1%82/) ### 避免值不存在 以範例而言,people.jay不在物件裡面,所以會跳紅字錯誤。 ![](https://i.imgur.com/fEO3WHk.png) 這時可以利用 `?.` ( **可選串連運算子** ) 來避免console中跳紅字錯誤,回傳出 `undefined` 的結果。 ![](https://i.imgur.com/UBCtA8t.png) people.jay是undefined ### 類陣列轉純陣列,用...展開 類陣列,類似陣列的結構,比起純陣列會少很多方法 如範例所示,在我們取出所有的p之後,如果我們用console.log去看p,就會變成 **類陣列** 。此時如果直接用 `map()` 會報錯。 ![](https://i.imgur.com/B9CXgyt.png) 因此我們可以透過 `[...]` 將他轉成純陣列,這樣才不會報錯。 ![](https://i.imgur.com/OSqRqNn.png) ### 預設值 我們在做這類計算函式時,需要加入預設值避免錯誤。 原始函式: ```jsx= function sum(a,b){ return a+b; } console.log(sum(1,3)) ``` 如果console.log沒有輸入b值,b的預設值就會是2;如果有輸入b值,就會以新輸入的值做計算。 ```jsx= function sum(a,b=2){ return a+b; } console.log(sum(1)) ``` #### 參考資料 [JS 語法糖整理](https://codingsnorlax.github.io/2021/12/28/2021-12-2021-12-JS-%E7%B0%A1%E5%AF%AB%E5%BD%99%E6%95%B4/)