ES5中,有number
,string
,boolean
,undefined
,null
這5種基本類型數據,外加object
引用類型數據(包括對象
,數組
,函數
)。
強制轉換
Number:可以將任意類型數據轉換成number
類型。
基本類型轉換為number類型
轉換類型 | 結果(number) | 備注 |
---|---|---|
100 | 100 | |
'100' | 100 | |
' ' | 0 | 空字符和空格都被轉成0 |
'100abc' | NaN | 區別于parseInt('100abc')=100,Number更嚴格 |
true | 1 | |
false | 0 | |
null | 0 | 區別于undefined,需特別注意 |
undefined | NaN |
引用類型轉換為number類型
,轉換規則如下:
- 調用對象自身的
valueOf
方法。如果返回原始類型的值,則直接對該值使用Number
函數,不再進行后續步驟; - 如果
valueOf
方法返回的還是對象,則改為調用對象自身的toString
方法。如果toString
方法返回原始類型的值,則對該值使用Number
函數,不再進行后續步驟。 - 如果
toString
方法返回的是對象,就報錯。
(這里,valueOf方法優先于toString調用
,示例如下)
var obj = {
valueOf: function() {
return 111;
},
toString: function() {
return 222;
}
}
Number(obj); // 111
轉換類型 | 結果(number) | 備注 |
---|---|---|
[] | 0 | [].toString() == '' |
[1] | 1 | [1].toString() =='1' |
[1,2,3] | NaN | [1,2,3].toString() == '1,2,3' |
function(){} | NaN | function(){}.toString() == 'function(){}' |
{} | NaN | {}.toString() == '[object Object]' |
String():可以將任意類型的值轉化成string
類型。
基本類型轉換為string類型
轉換類型 | 結果(string) | 備注 |
---|---|---|
100 | '100' | |
'100' | '100' | |
true | 'true' | |
false | 'false' | |
null | 'null' | |
undefined | 'undefined' |
引用類型轉換為string類型
,轉換規則如下:
- 先調用對象自身的toString方法。如果返回原始類型的值,則對該值使用String函數,不再進行以下步驟。
- 如果toString方法返回的是對象,再調用原對象的valueOf方法。如果valueOf方法返回原始類型的值,則對該值使用String函數,不再進行以下步驟。
- 如果valueOf方法返回的是對象,就報錯。
(這里,toString方法優先于valueOf調用
,示例如下)
var obj = {
valueOf: function() {
return 111;
},
toString: function() {
return 222;
}
}
String(obj); // 222
轉換類型 | 結果(string) | 備注 |
---|---|---|
[] | '' |
|
[1] | '1' |
|
[1,2,3] | '1,2,3' |
|
function(){} | 'function(){}' |
|
{} | '[object Object]' |
Boolean():可以將任意類型的值轉為boolean
類型。
轉換類型 | 結果(boolean) | 備注 |
---|---|---|
undefined | false |
|
null | false |
|
+0 | false |
|
-0 | false |
|
NaN | false |
|
'' | false |
|
' ' | true |
空格區別于空字符串 |
其他 | true |
a==b判斷
將等式兩邊都往number
上靠(undefined == null,比較特殊)
轉換類型 | 結果 | 備注 |
---|---|---|
"" == 0 | true |
Number("") == 0 |
" " == 0 | true |
Number(" ") == 0 |
"" == true | false |
Number("") == 0, Number(true) == 1 |
"" == false | true |
Number("") == 0, Number(false) == 0 |
" " == true | false |
Number(" ") == 0, Number(true) == 1 |
!" " == true | false |
Number(!" ") == 0, Number(true) == 1 |
!" " == false | true |
Number(!" ") == 0, Number(false) == 0 |
"hello" == true | false |
Number("hello") == NaN, Number(true) == 1 |
"hello" == false | false |
Number("hello") == NaN, Number(false) == 0 |
"0" == true | false |
Number("0") == 0, Number(true) == 1 |
"0" == false | true |
Number("0") == 0, Number(false) == 0 |
"00" == false | true |
Number("00") == 0, Number(false) == 0 |
"0.00" == false | true |
Number("0.00") == 0, Number(false) == 0 |
undefined == null | true |
比較特殊 |
{} == true | false |
Number({}) ==NaN, Number(false) == 0 |
[] == true | false |
Number([]) == 0, Number(true) ==1 |
[] == false | true |
Number([]) == 0, Number(false) ==0 |
var obj = { a: 0, valueOf: function(){return 1}} | - | - |
obj == "[object Object]" | false |
Number(obj) == 1,Number("[object Object]" == NaN) |
obj == 1 | true |
Number(obj) == 1 |
obj == true | true |
Number(obj) == 1, Number(true) == 1 |
if(xxx)
按照Boolean()
強制轉換規則轉換
自動轉換
堅持一條原則:預期什么類型,就往該類型上靠
。
- 自動轉
string
類型
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
- 自動轉
number
類型
'5' - '2' // 3
'5' * '2' // 10
true - 1 // 0
false - 1 // -1
'1' - 1 // 0
'5' * [] // 0
false / '5' // 0
'abc' - 1 // NaN
null + 1 // 1
undefined + 1 // NaN
自動轉
boolean
類型
參考前面Boolean()
強制轉換特殊情況
但是,在我進行測試的時候,發現了幾個特殊的例子,{}+1、{}+[] 這兩個例子在控制臺打印出的結果為 1 和 "",很奇怪是吧?我搜了搜資料發現,不同瀏覽器對其的解析不同,它會將前面一個 {} 當成代碼塊,于是上面的式子就變成了 +1 和 +[],所以得出了上面的結果。
作者:小烜同學
鏈接:https://juejin.im/post/5a9bd5cf51882555784d675b
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
針對上面這種例外,我們可以通過()
運算符解決。
{} + 1
= +1
= 1
(瀏覽器將{}
解析成代碼塊)
({}) + 1
= [object Object]1
[] + {}
= [object Object]
{} +[]
= +[]
= 0
(瀏覽器將{}
解析成代碼塊)
({}) + []
= [object Object]