---
# System prepended metadata

title: JavaScript Refresher
tags: ['Javascript, React']

---

# JavaScript Refresher

###### tags: `Javascript, React`

# Understanding "let" and "const"

![](https://i.imgur.com/mfSrZgs.png)


* var 目前不推薦使用
* let 主要取代 var 的功能，主要使用在 value 會改變時
* const 最大的差異在於被指派的 value 不能被重新指派

# Arrow Functions

解決了 this 關鍵字指向的問題

當你使用 arrow functions 並使用 this ，它會幫助其 this 的內容變得比較好預測

![](https://i.imgur.com/Yqghlno.png)

他們會產出一樣的結果

```javascript=
function printMyname(name){
    console.log(name);
}

printMyname('Max'); // Max 

const printMyname = (name) =>{
    console.log(name);
}

printMyname('Max'); // Max 
```

這邊來展示一些變化：

1. 當參數只有一個的時候可以省略參數的括號

```javascript=
const printMyname = name =>{
    console.log(name);
}

printMyname('Max'); // Max 
```

2. 當 function 只返回一個值或是函式時，可以省略 return 以及大括號

```javascript=
const mutiply = num => num*2;

console.log(mutiply(2)); //4
```

# Exports and Imports

因應模組化的 JS 必須使用 Exports and Imports 來達成這埸的效果，從一個 JS 檔案使用到不同的地點

## 範例

想要把這個 person 的變數使用在不同的檔案中就必須把它輸出 Export

person.js
```javascript=
const person = {
    name='Max'
};

export default person;
```
utility.js
```javascript=
const  = {
    name='Max'
};

export default person;
```

![](https://i.imgur.com/KsZR7zW.png)

把他們都引入 app.js 內

幾個重點

1.  default 的用處在於不管引入檔案寫的是什麼名字 person or prs ，都會是使用關鍵字 default 的那個內容也就是 const person
2.  可以看到 app.js 處理 utility.js 的部分使用大括號抓取出要使用的部分（名字必須一致）被稱為 named exports 當然也可以寫成一行 {baseData, clean} 來抓取


![](https://i.imgur.com/HYjvSop.png)

簡單分類一下：

* default export 

你在引入檔案的部分怎麼命名都無所謂，因為引入的檔案已經設定好了，怎麼指派名字都一樣


* named export 就有幾種變化

1. 引入明確的檔案名稱（名字必須一樣）
2. 使用 as 關鍵字引入之後再指派給新的變數名稱
3. 使用 * 引入全部，並且使用關鍵字 bundle 來操作 例如， bundle.baseData 這樣的方式來使用


# Understanding Classes

> classes 基本上就是物件的藍圖

![](https://i.imgur.com/5Mv5HU6.png)


創造 class 會使用 class key word ，裡面包含了 property （就是變數）以及 method （就是 function ）

![](https://i.imgur.com/k1a607X.png)


class 會透過 new key word 來做使用


![](https://i.imgur.com/In1zX86.png)


class 透過 extends 來做繼承記得要繼承的那個 class 使用 `super()` 才不會報錯

```javascript=
class Person {
    construcor() {
        this.name = 'Max'
    }
    
    printMyName () {
        console.log(this.name)
    }
}

const person = new Person();
person.printMyName()
```

這樣得出來的結果就會是 "Max"

下面示範繼承的 class 用法

```javascript=
class Human {
    constructor() {
        this.gender = 'female';
    }
    
    printGender() {
        console.log(this.gender);
    }
}


class Person extends Human {
    super(); // 記得在要繼承的地方加上 super 
    construcor() {
        this.name = 'Max'
    }
    
    printMyName () {
        console.log(this.name)
    }
}

const person = new Person();
person.printMyName(); //Max
person.printGender(); //female
```

## Classes, Properties&Methods

這邊會介紹更簡潔更新的 class 寫法

![](https://i.imgur.com/1tItsOO.png)

* 原本的 constructor 寫法被改寫成直接指派變數即可
* 原本的函式寫法變成箭頭函示也讓 this 的問題變簡單


我們來改寫一下上方的範例

```javascript=
class Human {
    gender = 'female';
    
    printGender = () =>{
        console.log(this.gender);
    }
}


class Person extends Human {
    
    name = 'Max';// 這邊 super 可以省略
    
    printMyName = () => {
        console.log(this.name)
    }
}

const person = new Person();
person.printMyName(); //Max
person.printGender(); //female
```