# <font size=10>強制轉型 & 如何作到轉換型別</font>
###### tags: `JavaScript` `JS 直播班 - 2021 秋季班`
JavaScript的資料型態是動態的,依據給予的值型態來決定資料型態
如果沒有給定變數的型別,JavaScript 會進行判斷
> ## 附上各型態轉換的結果圖

## <font size=7>JS上的顯性轉型、隱性轉型</font>
### <font size=6>顯性轉型</font>
就是在程式碼中常看到的字串轉數字、數字轉字串等等,自己手動的將變數轉成自己想要的資料型態
#### <font size=5>1.ToString</font>
任何非字串的數值都會被強制轉換成字串
**ToString的轉換規則**
* undefined => 'undefined'
* null => 'null'
* true => 'true'
* false => 'false'
* 非常大或非常小的數字 => '1.23e21'(用指數呈現)
* Array(陣列有自己定義的ToString) => [1,2,3].ToString() => '1,2.3';
#### <font size=5>2.ToNumber</font>
將非數字的數值轉換成數字來做運算
**ToNumber的轉換規則**
* undefined => NaN
* null => 0
* true => 1
* false => 0
* String => 數字(ex: '123') 或 NaN(ex: 'hello')
附上簡單的範例
```=JavaScript
Number(undefined) // NaN
Number(null) // 0
Number(true) // 1
Number(false) // 0
Number('5487') // 5487
Number('Hello world') // NaN
```
#### <font size=5>3.ToBoolean</font>
boolean值只有實際被強制轉型為一個boolean時才會遵循這種規則。
**ToBoolean的轉換規則 Truthly & falsy**
在JS會轉換成false值的會有
* ""(空字串)
* 0、-0、NaN
* null
* undefiend
* false
除了以上這些值以外都會轉換成true,其中特別的有
* [] array不管是不是空的
* {} object不管是不是空的
* function x(){} 函式
* '0' 文字的0
* ' ' 包含空白的引號
#### <font size=5>4.容易搞混的魔王 + </font>
``` =JavaScript
const c = "19";
const d = +c;
d; // 19
```
+號並不會做運算,而是會把c字串轉換成number值
不過如果程式複雜的話,對於維護程式是不容易管理的,還是避免使用的好~
##### +號將日期轉換數字
```=javascript
const a = new Date();
+a; // 1600876740123
```
+號除了可以把string轉換成number還可以將日期轉換成數字
#### <font size=5>5.parseInt</font>
從一個String中抓出Number,**<font color="red">切記最好只用在String上面</font>**
```=javascript
const a = "17";
const b = "17px";
Number(a); // 17
Number(b); // NaN
parseInt(a); 17
parseInt(b); 17
```
### <font size=6>隱性轉型</font>
#### <font size=5>加法</font>
```=javascript
100 + "100" // "100100"
100 + "ABC" // "100ABC"
"ABC" + "XYZ" // "ABCXYZ"
```
當加號 + 兩側的其中一方是字串的情況下,加號 + 會將兩者都視為「字串」連接在一起。
<font color='red'>number 、boolean 、 object</font> 的情況來說,轉型時會去呼叫它們的 .toString() 的「原型方法」去取得對應的字串。
<font color='red'>null 與 undefined </font>則是透過 JavaScript 的 String() 函數來將它們分別轉為 "null" 與 "undefined"。
example:
```=javascript
var num1 = 10;
var num2 = 100;
var str = "10 加 100 的數字會是" + num1 + num2;
```
猜猜看,此時 `str` 的結果會是什麼?
答案是 「 "10 加 100 的數字會是10100" 」。
會有這樣的結果是由於運算式的計算是「**由左而右**」且「**先乘除後加減**」的模式來運算。 也就是說,前面的字串會先與 `num1` 相加,再把結果與 `num2` 做相加。
若要避免這樣的問題時,可以在 `num1 + num2` 的算式中,用小括號 `( )` 包覆起來:
#### <font size=5>減法</font>
```=javascript
Infinity - Infinity // NaN
-Infinity - -Infinity // NaN
-Infinity - Infinity // -Infinity
Infinity - -Infinity // Infinity
```
1. <font color='red'>如果其中一方是 NaN 的話,那麼結果必定是 NaN。</font>
2. 與加號 + 不同的是,當其中一方不是「數字」的情況下:
* 基本型別 (如 <font color='red'>string 、 boolean 、 undefined </font>與 <font color='red'> null</font>)在做減法運算時,若其中一方屬於基本型別且不是數字的情況,那麼 JavaScript 會在先在背後透過<font color='red'> Number() </font>嘗試將數值轉為「數字」,再進行運算。
#### <font size=5>除法</font>
在前後兩者都是數字的情況下,計算結果就是兩個數值的商。
但是,在除數為 <font color='red'>`0`</font> 的情況下:
- 被除數為正數,則結果為 <font color='red'>`Infinity`</font>
- 被除數為負數,則結果為 <font color='red'>`Infinity`</font>
- 被除數為<font color='red'> `0`</font>,則結果為 <font color='red'>`NaN`</font>
當然,如果有其中一個是 <font color='red'>`NaN`</font>,則結果也會是 <font color='red'>`NaN`</font> 。
如果有其中一個不是數字的話,那麼 JavaScript 就會先在背後以 <font color='red'>`Nubmer()`</font> 作轉換後再進行計算。
#### <font size=5>乘法</font>
```=javascript
100 * "10" // 1000
100 * abc // NaN
100 * true // 100
100 * false // 0
100 * {} // NaN
```
在前後兩者都是數字的情況下,計算結果就是兩個數值的乘積。如果計算結果超出 JavaSCript 的數字範圍,那麼就會看結果是正數或負數來決定是 <font color='red'>`Infinity` </font>或是 <font color='red'>`-Infinity`</font>。
當然如果其中一個是 <font color='red'>`NaN`</font>的話,那麼結果必定也是<font color='red'> `NaN`</font>。而依照 IEEE754 標準的規定,<font color='red'> `Infinity * 0`</font> 的結果也是 <font color='red'>`NaN`</font>。
如果有其中一個不是數字的話,那麼 JavaScript 就會先在背後以 `Nubmer()` 作轉換後再進行計算
#### <font size=5>取餘數</font>
在前後兩者都是數字的情況下,計算結果就是除法運算後的「餘數」。
而被除數是 <font color='red'>`Infinity` </font>或 <font color='red'>`-Infinity`</font> 的情況下,則取餘數後結果都會是
<font color='red'>`NaN`</font>。
```=javascript
Infinity % 0 // NaN
Infinity % 100 // NaN
Infinity % Infinity // NaN
Infinity % -Infinity // NaN
```
被除數是一般數值,而除數為<font color='red'> Infinity</font> 的情況下,則結果為被除數:
```=javascript
100 % Infinity // 100
0 % Infinity // 0
```
被除數是一般數值,而除數為 <font color='red'>`0` </font>的情況下,則結果也是 <font color='red'>`NaN`</font>。當然,如果有其中一個是 <font color='red'>`NaN`</font>,則結果也會是 <font color='red'>`NaN`</font> 。
與除法一樣的是,如果有其中一個不是數字的話,那麼 JavaScript 就會先在背後以 <font color='red'>`Nubmer()`</font> 作轉換後再進行計算。
### <font size=6>參考資料</font>
* [你懂 JavaScript 嗎?#8 強制轉型(Coercion)](https://ithelp.ithome.com.tw/articles/10201512)
* [JavaScript 入門 - 強制轉型、Truthy & Falsy、條件式](https://zh-tw.coderbridge.com/series/9e5162da940f473a9f1cfeece124ee98/posts/7574ae0bc9734028b220faa7fb4b894b)
* [【這些年我似是非懂的 Javascript】Day 8 - 魔幻邪惡的強制轉型 #第一章 # 心情轉折](https://ithelp.ithome.com.tw/articles/10241735)
* [【這些年我似是非懂的 Javascript】Day 9 - 魔幻邪惡的強制轉型 #第二章 #明確的強制轉型](https://ithelp.ithome.com.tw/articles/10242376)
* [重新認識 JavaScript: Day 07 「比較」與自動轉型的規則](https://ithelp.ithome.com.tw/articles/10191254)