Udemy課程:[The Web Developer Bootcamp 2021(Colt Steele)](https://www.udemy.com/course/the-web-developer-bootcamp/)
# 第 23 節: Newer JavaScript Features
###### tags: `JavaScript` `Udemy` `The Web Developer Bootcamp 2021`
2021.03.10(Wed.)~03.17(Wed.)
## ● 上課筆記
## 1. Default parameters(預設參數)
在 JavaScript 中,函式的參數預設值都為 undefined 。
以往設定預設值有個普遍方法:在函式的內容裡檢查傳入參數是否為 undefined ,如果是的話,爲他指定一個值。
* 範例:
```javascript=
function rollDie(numSides){
if(numSides === undefined){
numSides = 6
}
return Math.floor(Math.random()*numSides) + 1
}
```
The new way!新的方法如下!
* 範例:
```javascript=
function rollDie(numSides = 6){
return Math.floor(Math.random()*numSides) + 1
}
```
## 2. Spread Operator(展開運算子)
> 參考網址:[JavaScript ES6 中的展開運算子(spread operator)和其餘運算子(rest operator)](https://pjchender.blogspot.com/2017/01/es6-spread-operatorrest-operator.html)
* 範例:
展開運算子可以把陣列中的元素取出。
```javascript=
//1:數字
const nums = [1,2,3,4,5]
Math.max(nums) //NaN
Math.max(...nums) //5
console.log(nums) //[1,2,3,4,5]
console.log(...nums) //1 2 3 4 5
//2:字串
console.log("Hello") //Hello
console.log(..."Hello") //H e l l o
console.log('H','e','l','l','o') //H e l l o
```
* Spread in array literals
Creat a new array using an existing array.Spreads the elements from one array into a new array.
```javascript=
const nums1 = [1,2,3]
const nums2 = [4,5,6]
console.log([...nums1, ...nums2])
//[1,2,3,4,5,6]
console.log(["a","b", ...nums2])
//["a","b",4,5,6]
console.log([...nums1, ...nums2,7,8,9])
//[1,2,3,4,5,6,7,8,9]
```
* Spread in object literals
Copies propertites from one object into another object literal.
```javascript=
const feline = {legs:4, family:"Felidae"}
const canine = {family:"Caninae", furry:true}
const dog = {...canine, isPet:true}
//{family:"Caninae", furry:true, isPet:true}
const lion = {...feline, genus:"Panthera"}
//{legs:4, family:"Felidae", genus:"Panthera"}
const catDog = {...feline, ...canine}
//{legs:4, family:"Felidae", family:"Caninae", furry:true}
```
## 3. Rest Parameter(其餘參數、剩餘參數)
> 長得很像展開運算子,但他不是!
> It looks like spread,but it's not.
>
> 參考網站:[Day08【ES6 小筆記】剩餘參數 - 基礎使用範例(Rest parameter)](https://ithelp.ithome.com.tw/articles/10214394)
其餘參數(rest parameter) 語法可以讓我們表示不確定數量的參數,並將其視為一個陣列。白話一點就是當function有不確定數量的參數時,ES6 提供的「剩餘參數」就可以幫助我們很容易 取得剩餘的所有參數,並保存在陣列裡。
意思是,假如我參數先用nums好了,那麼我的sum( )裡面就只能放一個參數:
```javascript=
function sum(nums){
console.log(nums)
}
sum(3) //不能再多放
```
所以如果我像要放多個參數,又不能確定要幾個參數時,就可以使用rest parameter了!
```javascript=
function sum(...nums){
console.log(nums)
}
sum(3,5,7,9) //無論放幾個都可以的!
```
* 範例:
```javascript=
function raceResults(gold, silver, ...everyoneElse){
console.log(`Gold medal goes to: ${gold}`)
console.log(`Silver medal goes to: ${silver}`)
console.log(`And thanks to everyone else: ${everyoneElse}`)
}
raceResults("Tammy","Todd","Tina","Trevor","Travis")
//Gold medal goes to: Tammy
//Silver medal goes to: Todd
//And thanks to everyone else: Tina,Trevor,Travis
```
## 4. 展開運算子(spread operator)和其餘運算子(rest operator)
| 名稱 | 內容比較 |
| ---- | -------- |
| 展開運算子(spread operator) |把陣列中的元素取出|
| 其餘運算子(rest operator) |把輸入函式中的參數值變成陣列的形式|
## 5. Destructuring assignment(解構賦值)
> 參考網址:[Day 08: ES6篇 - Destructuring Assignment(解構賦值)](https://ithelp.ithome.com.tw/articles/10185430)
解構賦值 (Destructuring assignment) 語法是一種 JavaScript 運算式,可以把陣列或物件中的資料解開擷取成為獨立變數。
* 從陣列解構賦值(Array destructuring)
用來賦值的等號符號(=)左邊按照你寫的變數或常數樣式,然後在右邊寫上要對映數值,就像之前說的"鏡子"般的樣式映對。當沒有對應位置的值時,就會被指定為undefined。
```javascript=
const scores = [90000000,80000000,7000000,60000000,50000000]
const [gold, silver, bronze, ...everyoneElse] = scores
console.log(gold) //90000000
console.log(silver) //80000000
console.log(bronze) //70000000
console.log(everyoneElse) //[60000000,50000000]
```
* 從物件解構賦值(Object destructuring)
```javascript=
const user = {
email: "harvey@gmail.com",
password:"sCoTt1948sMiTh",
firstName:"Harvey",
lastName:"Milk",
born: 1930,
died: 1978,
bio: "American politician",
city: "San Francisco",
state: "California"
}
//-----體取user資料中的email-----//
//一般方法:
const email = user.email
//Object destructuring方法:
const {email} = user
console.log(email) //harvey@gmail.com
//其餘用法:
const {email, firstName, lastName, city, bio} = user
console.log(email) //harvey@gmail.com
console.log(firstName) //Harvey
console.log(lastName) //Milk
console.log(city) //San Francisco
console.log(bio) //American politician
//若想要重新命名:
//如下所示,則將born存於新變數名birthYear
const {born: birthYear} = user
console.log(born) //born is not defined
console.log(birthYear) //1930
```
* Destructuring Params
```javascript=
const movies = [
{
title: 'Amadeus',
score: 99,
year: 1984
},
{
title: 'Sharknado',
score: 35,
year: 2013
},
{
title: '13 Going On 30',
score: 70,
year: 2004
},
{
title: 'Stand By Me',
score: 85,
year: 1986
},
{
title: 'Waterworld',
score: 62,
year: 1995
},
{
title: 'Jingle All The Way',
score: 71,
year: 1996
},
{
title: 'Parasite',
score: 95,
year: 2019
},
{
title: 'Notting Hill',
score: 77,
year: 1999
},
{
title: 'Alien',
score: 90,
year: 1979
}
]
//-----第一組比較-----//
//一般方法
movies.filter((movie) => movie.score >= 90)
//Destructuring Params方法
movies.filter(({ score }) => score >= 90)
//-----第二組比較-----//
//一般方法
movies.map(movie => {
return `${movie.title} (${movie.year}) is rated ${movie.score}`
})
//Destructuring Params方法
movies.map(({ title, score, year }) => {
return `${title} (${year}) is rated ${score}`
})
```