# 何謂強制轉型、以及如何作到轉換型別?
JavaScript中的資料類別是動態的,如果沒有給出明確的類別 JavaScript會自動判斷該值要轉換的類型,這個動作就叫做強制轉型。
> 檢視數據的類型可使用typeof()來進行判斷
強制轉型分成兩種
* 顯性轉型 : 可以在程式碼看到轉換過程
* 隱性轉型 : 由JavaScript自行判斷而轉換
## 顯性轉型
這種方式就是在編寫程式時自行將值轉換成想要的類型來利用。
### 轉換成字符串
1. .toString()
2. String()
3. 數字 + 字符串
```javascript=
// .toString轉換
let z = 16;
console.log(typeof z, z); //number 16
z = z.toString();
console.log(typeof z, z); //string "16"
// String()轉換
let x = 29;
console.log(typeof x, x); //number 29
x = String(x);
console.log(typeof x, x); //string "29"
//數字 + 字符串
let c = 3;
console.log(typeof c, c); //number 3
c = c + "4";
console.log(typeof c, c); //string "34"
//也可以 數字 + 空字符串
let v = 6;
console.log(typeof v, v); //number 6
v = v + "";
console.log(typeof v, v); //string "6"
// undefined/null 也可利用String()轉換
let b = undefined;
console.log(typeof b, b); //undefined undefined
b = String(b);
console.log(typeof b, b);
```
### 轉換成數字
1. Number() 將字串轉換成數字,可整數也可小數
2. parseInt() 將字串以無條件捨去的方式轉換成一個整數
3. parseFloat() 將字串轉換成包含小數點的數字
4. 通過 + 或 - 轉換,會改變正負值
:star:需注意:
```javascript=
// Number()
let n = "1.1";
console.log(typeof n, n); //string "1.1"
n = Number(n)
console.log(typeof n, n); //number 1.1
// parseInt()
let m = "2.2";
console.log(typeof m, m); //string "2.2"
m = parseInt(m)
console.log(typeof m, m); //number 2
//parseFloat
let a = "3.3";
console.log(typeof a, a); //string "3.3"
a = parseFloat(a)
console.log(typeof a, a); //number 3.3
// + / -
let s = "4.4";
console.log(typeof s, s); //string "4.4"
s = -s;
console.log(typeof s, s); //number -4.4
```
:notebook: 小筆記 :
> 空字符串/false/null轉換為0
> 字符串不僅僅是數字/nudefined 轉換為NaN
### 轉換成布林值
1. Boolean()
2. 加上!
```javascript=
// 數字
let d = 999;
console.log(typeof d, d); // number 999
d = Boolean(d);
console.log(typeof d, d); //boolean true
// 字符串
let f = "嗨";
console.log(typeof f, f); // string 嗨
f = Boolean(f);
console.log(typeof f, f); // boolean true
// 若為空字符串
let g = "";
console.log(typeof g, g); // string
g = Boolean(g);
console.log(typeof g, g); // boolean false
```
:notebook:小筆記
> 字符串只要有內容,轉換都是true
> 數字中只有0是false,其他都是true
> undefined/null轉換都是false
## 隱性轉型
### 字符串與數值
```javascript=
// 數字與字符串相加時JS會很貼心的將數值轉成String,並且串接
let h = "1";
let j = 2;
let k = [3,4];
let l = [5,6];
let r = "one"
console.log(h+j) //"12"
// 數字與字符串相加時JS會很貼心的將數值轉成字符串,並且串接
console.log(j*r) // NaN
//字符串中非數值與數值相乘會顯示NaN
console.log(h*j)
//但是相乘時卻是把字符串轉換成數值在相乘
console.log(k+l) //"3,45,6"
// 陣列使用+號不會陣列串接,而是會先個別先用toString()轉換成"3,4"和"5,6"後串接
```
### 布林值
```javascript=
//布林值與數值相加減會自動轉換成Number 1跟0
let q = 5;
let w = true; // 1
let e = false; // 0
console.log(q+w); // 6
console.log(q-e); // 5
```
## 參考資料
[[ 技術筆記 ] JavaScript|何謂強制轉型(coercion)以及如何作到轉換型別](https://medium.com/@sunnyhuang.sc/%E6%8A%80%E8%A1%93%E7%AD%86%E8%A8%98-javascript-%E4%BD%95%E8%AC%82%E5%BC%B7%E5%88%B6%E8%BD%89%E5%9E%8B-coercion-%E4%BB%A5%E5%8F%8A%E5%A6%82%E4%BD%95%E4%BD%9C%E5%88%B0%E8%BD%89%E6%8F%9B%E5%9E%8B%E5%88%A5-d7e39e30083)
[你懂 JavaScript 嗎?#8 強制轉型(Coercion)](https://ithelp.ithome.com.tw/articles/10201512)
{"metaMigratedAt":"2023-06-16T12:50:48.590Z","metaMigratedFrom":"Content","title":"何謂強制轉型、以及如何作到轉換型別?","breaks":true,"contributors":"[{\"id\":\"663fae2d-2bb5-4437-90b7-96f11a50e120\",\"add\":3112,\"del\":82}]"}