什麼是Javascript中的型別強制轉換Coercion?
型別強制Coercion是將值從一種型別轉換為另一種型別的過程(例如字串轉換為數字,物件轉換為布林值等)。任何型別,無論是原始型別還是物件,都是型別強制的有效主體
coercion有兩種表現形式:顯式和隱式。
下面是顯式明確方式的案例:
var a = "42"; var b = Number(a); a;// "42" b;// 42 -- 數字型!
下面是隱式轉換,也就是悄悄在做其他事時轉換了。
var a = "42"; var b = a * 1;// "42" 已經隱式轉換到 42 a;// "42" b;// 42 -- 數字型!
在90%的使用案例中,最好避免隱式型別強制。隱式強制是一種雙刃劍:它是挫折和缺陷的重要來源,但也是一種有用的機制,它允許我們在不失去可讀性的情況下編寫更少的程式碼。
但是,JavaScript中只有三種類型的轉換:
- 轉換到 string
- 轉換到 boolean
- 轉換到 number
原始型別和物件之間轉換是不同的,但是原始型別和物件只能按照這三種方式轉換。
字串轉換
要將值顯式轉換為字串,請應用該String()函式。當任何操作符是字串時,使用+二元運算子會觸發隱式強制:
String(123)//顯式 123 +''//隱式
所有原始值都會自然地轉換為字串:
String(123)// '123' String(-12.3)// '-12.3' String(null)// 'null' String(undefined)// 'undefined' String(true)// 'true' String(false)// 'false'
Symbol(符號 是ES6引入了一種新的原始資料型別,表示獨一無二的值。它是JavaScript 語言的第七種資料型別。Symbol轉換有點棘手,因為它只能顯式轉換,但不能隱式轉換:
String(Symbol('my symbol'))// 'Symbol(my symbol)' '' + Symbol('my symbol')// TypeError is thrown
布林轉換
要將值顯式轉換為布林值,請應用該Boolean()函式。
而隱式轉換髮生在邏輯上下文中,或由邏輯運算子(|| && !)觸發。
Boolean(2)// 顯式 if (2) { ... }// 隱式 !!2// 隱式 2 || 'hello'// 隱式
邏輯運算子,如||和&&做布林轉換內部,但Expressions_and_Operators#Logical_operators" rel="nofollow,noindex" target="_blank">實際上將返回原來的運算元的值 ,即使他們不是布林值。
//返回數字123,而不是返回true //'hello'與123仍在內部強制轉換為boolean以計算表示式 let x ='hello' && 123; // x === 123
一旦可能有兩個的布林轉換結果:true或者false,它就更容易記住false:
Boolean('')// false Boolean(0)// false Boolean(-0)// false Boolean(NaN)// false Boolean(null)// false Boolean(undefined)// false Boolean(false)// false
不在上述列表中的任意值都會被轉換為true,包括物件,函式Array,Date,使用者定義的型別,等等。符號Symbols 是true。空物件和陣列也是true的值:
Boolean({})// true Boolean([])// true Boolean(Symbol())// true !!Symbol()// true Boolean(function() {})// true
數字轉換
對於顯式轉換,只需應用Number()函式,就像使用Boolean()和執行一樣String() 。
隱式轉換很棘手,因為它在更多情況下被觸發:
- 比較運算子(>,<,<=,>=)
- 按位運算子(| & ^ ~)
- 算術運算子(- + * / %)。注意, 進行二進位制檔案+操作時,當任何一個運算元是字串時,不會觸發數字轉換。
- 一元運算+符
-
鬆散的平等運算子==(包括 !=)。
請注意,使用兩個等於號==,當兩個運算元都是字串時,不會觸發數字轉換。
Number('123')// 顯式 +'123'// 隱式 123 != '456'// 隱式 4 > '5'// 隱式 5/null// 隱式 true | 0// 隱式
要記住兩個特殊規則 :
1. ==到null或undefined,數字轉換不會發生。null僅等於null或等於或undefined等於其他任何東西。
2. NaN甚至不等於任何東西.
物件轉換
物件和JS引擎遇到表示式[1] + [2,3]時,首先需要將物件轉換為原始值,然後將其轉換為最終型別。仍然只有三種類型的轉換:數字,字串和布林值。
最簡單的情況是布林轉換:無論物件或陣列是否為空,任何非原始值都始終
被強制轉換 true。
通過內部[[ToPrimitive]]方法將物件轉換為原始型別,該方法負責數字和字串轉換。
規則1 :所有運算子將不同型別的運算元轉換為數字。
例外1: 邏輯運算子將它們轉換為布林值。
例外2:物件操作使用==和+ 時是使用ToPrimitive,首先為Date物件嘗試toString,然後返回物件的包裝符號值Symbol,null與undefined只在使用==時僅考慮彼此相等,不會轉化為任何其它型別。
例外3:如果其中一個運算元是字串,則+操作員也將另一個運算元轉換為字串。