---
# System prepended metadata

title: 何謂強制轉型、以及如何作到轉換型別？
tags: [六角學院, Javascript]

---

# 何謂強制轉型、以及如何作到轉換型別？
###### tags: `六角學院` ,`Javascript`

### 什麼是強制轉型？
---
JavaScript是一種==弱型別==的語言，在 JavaScript 中的資料型別是動態的，若沒有給定變數的型別，JavaScript 會自己進行判斷，這也是很多人討厭 JavaScript 並覺得他是不嚴謹的語言的原因。

而強制轉型，舉一個簡單的例子，假如有用到運算子，因為 + 運算子的運算元，只要有一個是 string 值，就會堅持進行 string 的串接，強制轉換為 string 型別。

```javascript=
var a = 4
var b = '4'
var c = a + b; 
console.log(c) // 44 但這是字串，a 被 JS 強制轉型為字串
```



而 JavaScript 中的強制轉型（coercion）分為兩種，分別是
- **「顯性轉型」**（explicit coercion）
指程式中==看的出來==刻意要進行轉型的情況。
- **「隱性轉型」**（implicit coercion）
指程式中==看不出來==，為了某些原因需要進行轉型的情況。

> 不過要記得的是，程式碼很少只是寫給自己讀的，要考慮到團隊成員閱讀你的程式碼時會怎麼想，他們的明確與隱含是否和你一樣？

> 值得注意的是，強制轉型的結果都會是基本型別，例如數字、布林值或字串。

以下以表格的方式來顯示每個基本型別做轉型後的值，會比較清楚。

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


---

### 「顯性轉型」（explicit coercion）
顯性轉型常見的幾種有
- 「字串轉數字」
    - **parseInt()** 將字串以無條件捨去的方式轉換成一個整數
    - **parseFloat()** 將字串轉換成包含小數點的數字
    - **Number()** 轉換字串為數字，可以是整數也可以是小數
    - 在字串前加上「+」也會將字串轉為數字

- 「數字轉字串」
    - **toString()**
    - **String()**
    - 數字加上任何字串（數字 / 字串前後沒有差異，都會變成字串）

- 「數字或字串轉布林值」

    - **Boolean()**
    - 在數字或字串前加上「!」



---

### 「隱性轉型」（implicit coercion）
JavaScript 中最常見到隱性轉型會出現在數字和除了加法以外的運算子中的應用，包含 true 會被轉成 1，false 會被轉成 0。

隱性轉型直接來看範例會比較清楚 : 

```javascript=
var a = "1"
var b = 3
console.log(a+b, typeof(a+b)) //13 string
console.log(a-b, typeof(a-b)) //-2 number
console.log(a*b, typeof(a*b)) //3 number
console.log(a/b, typeof(a/b)) //0.3333333333333 number
```
```javascript=
var a = "1"
var b = true
console.log(a+b, typeof(a+b)) //1true string
console.log(a-b, typeof(a-b)) //0 number
console.log(a*b, typeof(a*b)) //1 number
console.log(a/b, typeof(a/b)) //1 number
```

> 值得注意的是，"+" 這個運算子的轉型比較特別，因為字串型別是可以互相串接的。


---
### 參考資料
[JavaScript 全攻略：克服 JS 的奇怪部分](https://medium.com/stuarthsu/javascript-%E5%85%A8%E6%94%BB%E7%95%A5-%E5%85%8B%E6%9C%8D-js-%E7%9A%84%E5%A5%87%E6%80%AA%E9%83%A8%E5%88%86-cf44d08ffc0)
[強制轉型 - 轉換值、ToString、JSON](https://zh-tw.coderbridge.com/series/9e5162da940f473a9f1cfeece124ee98/posts/bd04fcb5c84c42e3b50e5835ad921f94)