---
# System prepended metadata

title: 四之 6、 JS 102 ES6 更新：箭頭函式 arrow Function
tags: [Lidemy心得, JS102, JavaScript續, 進度筆記, 2020八月第二週]

---

# 四之 6、 JS 102 ES6 更新：箭頭函式 arrow Function  
###### tags: `JS102` `JavaScript續` `2020八月第二週` `進度筆記` `Lidemy心得` 8/4

[箭頭函式](https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Functions/Arrow_functions) 可以省略 function 的做法，可以提高閱讀性。  

---
與一般函式相比:
```
function test(n) {
  return n
}

const test = (n) => {
  return n 
}
```

只有一個參數連 ( ) 都能省略:
```
const test = n => {
  return n 
}
```

## 好處在哪 ?
```
var arr = [1, 2, 3, 4, 5]
console.log(
  arr
    .filter(function(value) {
      return value > 1
    })
    .map(function(value) {
      return value * 2
    })
)
```
會印出 [ 4, 6, 8, 10 ] ， 過濾掉 1 ， 然後將每個值 * 2 。  

但有了箭頭函式會省很多工:  
```
var arr = [1, 2, 3, 4, 5]
console.log(
  arr
    .filter(value => {
      return value > 1
    })
    .map(value => {
      return value * 2
    })
)
```
印出 [ 4, 6, 8, 10 ]  

還可以更省略:  
```
var arr = [1, 2, 3, 4, 5]
console.log(
  arr
    .filter(value => value > 1)
    .map(value => value * 2)
)
```
印出 [ 4, 6, 8, 10 ] 。   

可讀性變得更高，連區塊都省略。  
被稱作語法糖，包裝了很多東西，如果要函式做很多事情:
```
 .filter(value => {
   ...
   .
   .
   .
   
      return value > 1
    })
```
就可能這樣做比較好，才不會太過精簡。

跟 `this` 也有關。

---
參考資料:  

[鐵人賽：箭頭函式 (Arrow functions)
](https://wcc723.github.io/javascript/2017/12/21/javascript-es6-arrow-function/)

[[筆記] JavaScript ES6 中的箭頭函數（arrow function）及對 this 的影響](https://pjchender.blogspot.com/2017/01/es6-arrow-function.html)

[箭頭函式](https://eyesofkids.gitbooks.io/javascript-start-from-es6/content/part4/arrow_function.html)

---


# 四之 7、 JS 102 ES6 Babel 新舊相容
###### tags: `JS102` `JavaScript續` `2020八月第二週` `進度筆記` `Lidemy心得` 8/7

Babel 的安裝說明：https://babeljs.io/docs/en/next/babel-node.html


是重要的開發工具，如果想要用某物，但其支援度很少，開發工具將現在新的語法轉乘舊式語法，或是可以支援舊的瀏覽器，前端發展速度很快。

---

## 用法: `npx babel-node`

`npx babel-node` 的用法: 

可以執行更新的指令，用在生產上會造成記憶體大量負擔，通常會用在開發。

先在有 npm 或是 yarn 的基礎下安裝，安裝的資料夾中要含有 node_modules 資料夾，以及 package.json 檔案; 官方網站以 npm 安裝為基準，因此先以 npm 指令安裝 `npm install --save-dev @babel/core @babel/node @babel/preset-env` 。  
有 @babel/preset-env 才能執行新的含 ES6 或以上語法，把多新的語法換成多舊的語法。

好了後新增一個空白檔案 .babelrc 檔案，內容為:
```
{

 "presets": ["@babel/preset-env"]

}
```
填入內容後，是在告訴 babel 要用這個 preset ， 沒有這個檔案也會跑不了 。


最後使用 `npx babel-node index.js` 指令下去跑即可 (記得也要有模組檔案，以下範例都是以 utils.js 檔案為例)。

---

# 四之 8、 JS 102 ES6 更新：導入和導出，進出口貿易會有順差 
###### tags: `JS102` `JavaScript續` `2020八月第二週` `進度筆記` `Lidemy心得` 8/5

ES6 導入和導出 (import and export) 

ES6 Export 有幾種方式：

    export function add(){}，使用 import {add} 引入
    export { add }，與上面那種一樣
    export default function add()，使用 import add 引入，不需要加大括號

如果想要用其他名字，可以用 as 取別名，例如說 export { add as addFunction }

可以用 import * as utils from 'utils' 把全部都 import 進來。

---
最基本的 export 在欲導出的檔案 (以 utils.js 檔案為例) ， function 前面加 utils :  
```
export function add(a, b) {
  return a + b
}

export const PI = 3.1415
```
然後在 index.js 檔案這樣寫:
```
/*
var add = require('./utils')

console.log(add(3, 5))
*/

import {add, PI} from './utils'

console.log(add(3, 5))
```
會發現加入 import 更動了，且不用宣告。  
但這樣印不出來，需要用 Babel `npx babel-node import.js` 指令來跑的話會印出 8 。

---

## export {} 變形
```
export function add(a, b) {
  return a + b
}

const PI = 3.1415

export {
  add as addFunction,
  PI
}
```
會印出 8 3.1415 ， export { } 不是物件，要印出別的名稱;  

utils.js 檔案必須改成:

```
export function add(a, b) {
  return a + b
}

const PI = 3.1415

export {
  add as addFunction,
  PI
}
```

index.js 檔案內則是:
```
import {addFunction, PI} from './utils'

console.log(addFunction(3, 5), PI)
```

---

## import * as 

可以把所有東西導入進來:  
utils.js 修改成:
```
export function add(a, b) {
  return a + b
}

const PI = 3.1415

export {
  add as addFunction,
  PI
}
```
在 index.js 檔案內則是:
```
import * as utils from'./utils'

console.log(utils.addFunction(3, 5), utils.PI)
```
會印出 8 3.1415。
``*`` 在程式語言代表所有東西。
東西多的時候可以用 `import * as utils from'./utils'` 。

---

## export default

可以在 export 時使用預設值，例如在 utils.js 檔案內:  
utils.js 檔案必須改成:

```
export default function add(a, b) {
  return a + b
}

export const PI = 3.1415
```

一旦在模組 utils.js 檔案內加入 default 後，可以在 index.js 檔案內修改:  
```
import add from'./utils'

console.log(add(3, 5))
```
會印出 8 ; 跟在用 require 有點像，差別在不用加入 { }。

如果要用到 PI :  
```
import add, {PI} from'./utils'

console.log(add(3, 5), PI)
```
會印出 8 3.1415 。  

default 也能 as :  
```
import {default as add, PI} from'./utils'

console.log(add(3, 5), PI)
```
一樣會印出 8 3.1415 。

新專案蠻常用 ES6 的導入導出。

---

# 四之 8、 JS 102 ES6 學習仍在持續
###### tags: `JS102` `JavaScript續` `2020八月第二週` `進度筆記` `Lidemy心得` 8/8

ES6 之後還要學習 Map, Set< Symbol ， 有必要用的時候才會用到新語法，宣告變數會比較常用，之後會比較少用到 var 。

[更多 ES6 學習使用參考](https://github.com/DrkSephy/es6-cheatsheet)

模組化的 ES6 語法還蠻常用，所以把 function 放到另外一個檔案(模組)，出事的時候可以修一個模組就好 ， npm 在專案也很重要，在 framework 或 library 就會需要引入，jest 測試也蠻適合訓練，實際開發時單元測試也很常見，之後會學到 JS 在瀏覽器的應用。

---
