###### tags: `六角JS 直播班 - 2021 秋季班` 何謂強制轉型、以及如何作到轉換型別? === ## 型別轉換分類 - Type Conversion - Type Coercion - 顯性轉型(Explicit Coercion) - 隱性轉型(自動轉型,Implicit Coercion) ### 強制轉換(coercion) #### 顯性轉型(Explicit Coercion) 在程式碼中可以觀察到「刻意寫出型別轉換」的動作,就是「顯性轉型」。 - 轉換成字串string 1. toString(); null跟undefined無法使用toString()這個方法,否則為報錯 ```javascript= let a = 1; typeof a; //number a.toString(); //"1" typeof a.toString(); //string let b = null b.toString(); // Uncaught TypeError: Cannot read properties of null (reading 'toString') let c = undefined; console.log(c.toString()); //Uncaught TypeError: Cannot read properties of undefined (reading 'toString') ``` <br> 2. String() 如果是數字或布林,使用toString();方法就好,對於null跟undefined來說,使用String()函式才不會報錯 ```javascript= let a = undefined; String(a); //undefined let b = null; String(b); //null let a = 7; console.log(String(a), typeof String(a)); //"7" string //要用String()函式也是可以 ``` <br> >特別注意! >如果是物件,會回傳一個型別字串;如果是陣列,會回傳該陣列的字串形式 ```javascript= String({a:1}) //'[object Object]' String([111, 222]) //'111,222' ``` - 轉換成數字number 1. Number() 先討論「基本型別」 ```javascript= //字串轉數字 Number('123') // 324 Number('456a') // NaN a為非數字 Number('') // 0 空字串回傳0 //布林轉數字 Number(true) // 1 Number(false) // 0 // undefined轉數字 Number(undefined) // NaN // null轉數字 Number(null) // 0 ``` 再討論「物件型別」 ```javascript= Number({a: 1}) // NaN Number([1, 2, 3]) // NaN Number([5]) // 5 單個值的陣列可正常回傳 ``` 2. parseInt() 與 parseFloat() 兩者區別在於parseFloat()可取得小數點 ```javascript= console.log(parseInt("36.5 degrees")); //36 console.log(parseFloat("36.5 degrees")); //36.5 ``` >Number()跟parseInt()的區別 >Number較嚴謹,只要當中有不能轉為數字的字符,就會回傳NaN ```javascript= parseInt("2 coffee") // 2 Number("2 coffee") // NaN ``` - 轉換成布林值 Boolean() 沒什麼好說的(?) ```javascript= Boolean(0) // false Boolean('') // false Boolean(NaN) // false Boolean(null) // false Boolean(undefined) // false Boolean({}) // true Boolean([]) // true Boolean(new Boolean(false)) // true 他是個物件,只要是物件(即使是空物件)就是true ``` <br> #### 隱性轉型(自動轉型,Implicit Coercion) 沒有刻意寫出型別轉換的程式碼,JS會在背後偷偷幫忙轉換型別 - 轉換成布林值 ```javascript= //範例1 if (abc) { // 字串是truthy value console.log("hello") // this line of code will be executed } else{ console.log("sorry") } //範例2 let money; //did't set a value to money, money is undefined. if (money){ console.log("I have money."); }else{ console.log("I don't have money"); // this line got executed // } ``` - 轉換成數字 - 加號:如果有其中一邊是字串,會將左右兩側都視為「字串」並相加 - 減號:會將左右兩側都視為「數字」並相減 - 乘號:會將左右兩側都視為「數字」並相乘 - 除號:會將左右兩側都視為「數字」並相除 - 布林:true會轉成1,false跟null會轉為0,其中null 與數字做加法會轉為數字0,null與字串做加法會轉成字串 ```javascript= let a = true + false; //1 let a = true + true - 1; //1 let b = false + 123; //123 let c = null + 123; //123 let d = null + '123'; //"null123" let e = false > true ; //false let f = true === 1 ; //true "2" + 5//25 2 + 2 //4 2 + "5" - 1 //24 2 + "5" + 1 //251 2 + "5" - "1" //24 "10" - 3 + 5 //12 "10" + 3 - 5 //98 "20" / 10 //2 ``` >**參考資料** >[你懂 JavaScript 嗎?#8 強制轉型(Coercion)](https://cythilya.github.io/2018/10/15/coercion/) >[JavaScript資料型別轉換](https://www.uj5u.com/qiye/254374.html) >[The Complete JavaScript Course 2021: From Zero to Expert!](https://www.udemy.com/course/the-complete-javascript-course/) Lesson 20
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up