<style> .title{ font-size:20px; font-weight:bold; color:#283593; } </style> # Javascript ES6基礎觀念 ###### tags: `OKR` `ES6` `Javascript` ##### 2020/07/22(Update:2020/07/24) ## var與let比較是否可以重複宣告 直接從程式碼就可以看出差異,var可以重複宣告,但let比較嚴謹會提醒不能重複宣告。 ```javascript var a = 1; console.log(a); var a = 2; console.log(a); result: 1 2 --- let b=1; console.log(b); let b=2; console.log(b); result: 1 Identifier 'b' has already been declared //提示說已經被宣告了 ``` ### 被{}包起來區塊範圍,var與let的差異 被{}包起來區塊範圍裡面,來看看var與let的差異: ```javascript { var a = "我是a"; let b = "我是b"; console.log('a列印結果:',a); console.log('b列印結果:',b); } result a列印結果: 我是a b列印結果: 我是b ``` 若是今天將console.log移到外面的話,會發生什麼事情? ```javascript { var a = "我是a"; let b = "我是b"; } console.log('a列印結果:',a); console.log('b列印結果:',b); result a列印結果: 我是a ReferenceError: b is not defined //結果b會被顯示沒有被宣告,代表let撰寫比較嚴謹 ``` ### let宣告變數 依據上述比較let與var之間的差異,可宣告變數/得到相同結果,但最大的差別是在於let所宣告的變項只有在{}代碼區塊(block scope)內有效。 ## ES5/ES6放入html內容使用差異 在之前ES5在放入Html內容,必須要一行一行加入,在ES6的模版字符串(template literal)是使用反引號``放入html內容。 在之前,若行數很多的話容易不小心打錯內容,除了很麻煩,也不易閱讀 ```javascript let addHtml_es5 = '<header>' + '<div class="banner">' + '</div>' + '</header>' ``` 現在ES6使用反引號快速解決這樣的狀況,列印結果,更方便的是他會幫你保留所有換行和空行,顯示結果跟你的輸入排版差不多。 ```javascript let addHtml_es6 = ` <header> <div class="banner"> </div> </header> ` //print result <header> <div class="banner"> </div> </header> ``` 若是有嵌入宣告變數的寫法 使用方式為${.....} ```javascript let youtubeSrc = 'https://www.youtube.com/embed/lJIrF4YjHfQ?autoplay=1'; $('.embed-responsive').append(`<iframe class="youtube_frame" style="width:100%;height:100%;" src="${youtubeSrc}" frameborder="0" scrolling="no" allowfullscreen></iframe>`); //print result <iframe class="youtube_frame" style="width:100%;height:100%;" src="https://www.youtube.com/embed/lJIrF4YjHfQ?autoplay=1" frameborder="0" scrolling="no" allowfullscreen> </iframe> ``` ## 什麼是const - const全名為`Constants`,中文叫++常數++,有點像使用let宣告的變數。 - 常數可以宣告成大寫或小寫,但習慣上使用++全部大寫++的字母。 - 常數不能重複指定值,也不能重複宣告中。 ``` const MY_FAV = 7; ``` ## Constructor建構子 - 隨著Class一同建立並初始化物件的特殊方法 - 一個Class只能有一個Constructor,如果一個Class出現兩次以上,就會發生錯誤。 ### class類別 ``` class MyClass{ constructor(){ } } ``` - ES6 ClassName類別語法 - 命名時採用大駝峰式寫法 - 類別Class是先定義好物件的整體結構,並不會直接產生物件,要經過實體化的過程(new運算符),才會產生真正的物件。 ## 展開運算符(Spread Operator) ES6的新寫法,使用三個點(...),主要是連接陣列使用,範例如下: ``` const params = [ "hello", true, 7 ] const other = [ 1, 2, ...params ] 這樣就會將params裡的陣列複製到other裡面 [ 1, 2, "hello", true, 7 ] ``` 若複製陣列,再傳值進去也不會受到影響 ``` const arr = [1,2,3] const arr2 = [...arr] arr2.push(4) //push()向數組的末尾加一個或多個元素 //所以列印結果為[1,2,3,4] ``` 把某個陣列展開,然後傳入函式作為傳入參數值 ``` function sum(a, b, c) { return a + b + c } const args = [1, 2, 3] sum(…args) //列印結果為1+2+3=6 ```