# <font size=10>強制轉型 & 如何作到轉換型別</font> ###### tags: `JavaScript` `JS 直播班 - 2021 秋季班` JavaScript的資料型態是動態的,依據給予的值型態來決定資料型態 如果沒有給定變數的型別,JavaScript 會進行判斷 > ## 附上各型態轉換的結果圖 ![](https://i.imgur.com/KClTPm3.png) ## <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)