# 四之 1、 JS 102 進入 ES
###### tags: `JS102` `JavaScript續` `2020七月第五週` `進度筆記` `Lidemy心得` `7/30
---
## ES5 ES6 的概念,現在已經到 ES11 !?
ECMAScrpit 由歐洲電腦製造商(現為 ECMA 電信標準組織) 推行的標準化規範,可根據這個規格來開發 , JavaScript 即是根據這根據這標準。
ES6 (也有這樣稱呼 ES6=ES2015) 在 2015 年發布新版本, ES5 是稍微舊一點的版本,但可以查詢 JS 內容和運作。
參考資料:
[Day2 [JavaScript 基礎] 淺談 ECMAScript 與 JavaScript](https://ithelp.ithome.com.tw/articles/10213310)
[ECMA-262](https://www.ecma-international.org/publications/standards/Ecma-262.htm)
---
## ES6 新增了 let 和 const
新增類似 var 的宣告方法。
```
let a = 10
const b = 10
console.log(a, b )
```
常數 constant (const) , 會不能改變他的值,因為是個變數,但是如果對其這樣做:
```
let a = 10
const b = {
number: 10
}
b.number = 20
console.log(a, b )
```
因 const 宣告這個物件後存在記憶體內的值,被外部更動了 (.number) 去改了內部的值。
但如果先宣告了某值,後面再去更動 const 的宣告就不行:
```
let a = 10
const b = '123'
b= '456'
console.log(b)
```
b 會無法被賦上 456 的值。
---
## 作用域 (scope)
作用域 (scope) 是變數的生存範圍, JS 內是以 function 作為變數的生存範圍 ,例如:
```
var a = 10
function test() {
console.log(a)
}
test()
```
`var a = 10` 這行是在 function 的上層,因對 function 區塊內要求要印出 a , 但區塊內沒有 a 就會往上一層找,直到找到為止。
這樣 test() 下的 `console.log(a)` 會找不到,因為是 function 區塊內的 `console.log(a)` 和 底下的 test() 位於不同層:
```
function test() {
var a = 10
console.log(a)
}
test()
console.log(a)
```
可以以這個例子得知 a 的生存範圍在 function 內。
---
## 因此 let 的生存範圍很小
var 這樣是活得下去的,例如:
```
function test() {
if (10 > 5 ) {
var a = 10
}
console.log(a)
}
test()
```
用 `console.log(a)` 可以從外面拿到區塊內的 a 值。
但是 let 和 const 就只能活在區塊 { } 內,用 `console.log(a)` 無法拿到區塊內的 a 值:
```
function test() {
if (10 > 5 ) {
let a = 10
}
console.log(a)
}
test()
```
這樣子要讓 `console.log(a)` 也跟 let 同一層 (即同一區塊內) 才能拿到 a 值。
有些 value 沒有要改變的情況可以用 const , 盡量用 let 而不是 var , 因為會希望作用域越小越好,像 var 可能會互相干擾(干擾其他層),而 let 可以限縮只作用在某一區塊內。
---
# 四之 2、 JS 102 ES6 樣板字面值
###### tags: `JS102` `JavaScript續` `2020七月第五週` `進度筆記` `Lidemy心得` 7/30
---
## 樣板字面值 (template literals)
### 字串傳統拼接的兩個問題。
1. 多行字串 ES6 以前要設定多行的方法:
```
var str = '' +
'XD' + '\n' + // 換行的意思;
'XDD'
console.log(str)
```
這樣才會拼接變成多行字串。
2. 太多字串拼接的時候會很繁瑣:
```
function sayHi(name) {
console.log('hello, ' + name + ' now is ' + new Date())
}
sayHi('Haku')
```
可能會 '' 和 + 號搞混。
---
## 多行字串
因此在 ES6 (ES2015) 多行字串 (Template literals) 使用前導字元鍵 `` 來解決這個問題。
一樣可以當一般字串使用:
```
var str = `str`
console.log(str)
```
也可以多行字串:
```
var str = `
Hi
Hello
How are you ?
`
console.log(str)
```
好處是可以直接多行(更懶了),不用打換行符號。
---
### 也可以與 ${ } (常在區塊內放變數) 併用。
跟之前用一堆 str 比照的話:
```
function sayHi(name) {
console.log('hello, ' + name + ' now is ' + new Date())
}
sayHi('Haku')
```
架好模板直接用:
```
function sayHi(name) {
console.log(`hello, ${name} now is ${new Date()}`)
}
sayHi(`Haku`)
```
${name} 像是内嵌的方式,取 name 這個變數,也可以在 $ { } 內放內建函式,這樣子的模板架構也比較好懂,直覺。
---
參考資料:
[樣板字面值](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Template_literals)
[[筆記] JavaScript ES6 中的模版字符串(template literals)和標籤模版(tagged template)](https://pjchender.blogspot.com/2017/01/javascript-es6-template-literalstagged.html)
[JavaScript ES6 Template Literals 字串樣版](https://www.fooish.com/javascript/ES6/template-literals.html)
---
# 四之 2、 JS 102 ES6 解構 (destructuring)
###### tags: `JS102` `JavaScript續` `2020八月第一週` `進度筆記` `Lidemy心得` 8/2
ES6 提供解構賦值的新方法,可以提高閱讀性和效率。
---
## 陣列解構
一般排陣列的方式:
```
const arr = [1, 2, 3, 4]
var first = arr[0]
var second = arr[1]
var third = arr[2]
var fourth = arr[3]
console.log(second , third)
```
ES6 可以更直觀的這樣看:
```
const arr = [1, 2, 3, 4]
var [first, second, third, fourth] = arr
console.log(second , third)
```
會直接對應上去。
---
## 物件解構
ES5 一般 obj 的作法:
```
const obj = {
name: 'Haku',
age:30,
address: 'Taiwan No.1'
}
var name = obj.name
var age = obj.age
var address = obj.address
console.log(address)
```
會印出 Taiwan No.1 。
ES6 中的解構方式:
```
const obj = {
name: 'Haku',
age: 30,
address: 'Taiwan No.1'
}
var {name, age, address} = obj
console.log(address)
```
好處是 ES6 中的解構不用像 ES5 這樣 `var name = obj.name` 可以省略宣告賦值 name 和 age ,直接拿出來成為變數; 和省略初始值 key , 把 name 跟 age 設為 obj.name 和 obj.age 。
---
### 可以一層一層疊上去
```
const obj = {
name: 'Haku',
age: 30,
address: 'Taiwan No.1',
family: {
mom: 'Hi'
}
}
var {family} = obj
console.log(family)
```
可以得到物件 { mom: 'Hi' } 。
用ES6 解構的語法:
```
const obj = {
name: 'Haku',
age: 30,
address: 'Taiwan No.1',
family: {
mom: 'Hi'
}
}
var {name, age, address, family} = obj
var {mom} = obj
console.log(family, address)
```
一樣可以拿到物件 { mom: 'Hi' } 和 上層的 Taiwan No.1 。
---
### 更複雜一點的,可以解構後再度解構:
```
const obj = {
name: 'Haku',
age: 30,
address: 'Taiwan No.1',
family: {
mom: 'Hi'
}
}
var {family: {mom}} = obj
console.log(mom)
```
會得到 Hi , 只拿最後一層,前面 family 無法拿。
其實是這樣對應:
```
const obj = {
family: {
mom: 'Hi'
}
}
var {
family: {
mom
}
} = obj
console.log(mom)
```
兩個物件結構類似,這是雙層解構。
---
### 函式內的解構
一般函式內從前面傳入:
```
function test(obj) {
console.log(obj.a)
}
test({
a:1,
b:2
})
```
函式內解構:
```
function test({a, b}) {
console.log(a)
}
test({
a:1,
b:2
})
```
在函式裡面放 { } 取物件的值出來用。
---
參考資料:
[解構賦值](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
[解構賦值](https://eyesofkids.gitbooks.io/javascript-start-from-es6/content/part4/destructuring.html)
[[筆記] JavaScript ES6 中的陣列解構賦值(array destructuring)](https://pjchender.blogspot.com/2017/01/es6-array-destructuring.html)
[[筆記] JavaScript ES6 中的物件解構賦值(object destructuring)](https://pjchender.blogspot.com/2017/01/es6-object-destructuring.html)
[Day 08: ES6篇 - Destructuring Assignment(解構賦值)](https://ithelp.ithome.com.tw/articles/10185430)