<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
```