JavaScript數據類型
因為JavaScript是弱類型的語言,所以類型轉換髮生非常頻繁。
類型轉換分為兩種,隱式轉換即程序自動進行的類型轉換,強制轉換即我們手動進行的類型轉換。
強制轉換這裡就不再多提及了,下面我們來看看讓人頭疼的可能發生隱式類型轉換的幾個場景,以及如何轉換:
if語句和邏輯語句
—
在 if 語句和邏輯語句中,如果只有單個變量,會先將變量轉換為Boolean值,只有下面幾種情況會轉換成false,其餘被轉換成 true:
null
undefined
''
NaN
0
false
各種數學算符
—
我們在對各種非Number類型運用數學運算符(- * /)時,會先將非Number類型轉換為Number類型;
1 - true// 0
1 - null// 1
1 * undefined// NaN
2 * ['5'] // 10
注意+是個例外,執行+操作符時:
1. 當一側為String類型,被識別為字符串拼接,並會優先將另一側轉換為字符串類型。
2. 當一側為Number類型,另一側為原始類型,則將原始類型轉換為Number類型。
3. 當一側為Number類型,另一側為引用類型,將引用類型和Number類型轉換成字符串後拼接。
123 + '123'// 123123 (規則1)
123 + null// 123 (規則2)
123 + true// 124 (規則2)
123 + {} // 123[object Object] (規則3)
==
—
使用==時,若兩側類型相同,則比較結果和===相同,否則會發生隱式轉換,使用==時發生的轉換可以分為幾種不同的情況(只考慮兩側類型不同):
NaN
NaN和其他任何類型比較永遠返回false(包括和他自己)。
NaN == NaN// false
Boolean
Boolean和其他任何類型比較,Boolean首先被轉換為Number類型。
true == 1// true
true == '2'// false
true == ['1'] // true
true == ['2'] // false
這裡注意一個可能會弄混的點:undefined、null和Boolean比較,雖然undefined、null和false都很容易被想象成假值,但是他們比較結果是false,原因是false首先被轉換成0:
undefined == false// false
null == false// false
String和Number
—
String和Number比較,先將String轉換為Number類型。
123 == '123'// true
'' == 0// true
Null和Undefind
—
null == undefined比較結果是true,除此之外,null、undefined和其他任何結果的比較值都為false。
null == undefined// true
null == ''// false
null == 0// false
null == false// false
undefined == ''// false
undefined == 0// false
undefined == false// false
原始類型和引用類型
—
當原始類型和引用類型做比較時,對象類型會依照ToPrimitive規則轉換為原始類型:
'[object Object]' == {} // true
'1,2,3' == [1, 2, 3] // true
!的優先級高於==,![ ]首先會被轉換為false,然後根據上面第二點,false轉換成Number類型0,左側[]轉換為0,兩側比較相等。
[] == ![] // true
根據數組的ToPrimitive規則,數組元素為null或undefined時,該元素被當做空字符串處理,所以[null]、[undefined]都會被轉換為0。
[null] == false// true
[undefined] == false// true
所以,說了這麼多,推薦使用===來判斷兩個值是否相等...
隱式轉換規則
—