ES5中,有number
磕潮,string
翠胰,boolean
容贝,undefined
,null
這5種基本類(lèi)型數(shù)據(jù)之景,外加object
引用類(lèi)型數(shù)據(jù)(包括對(duì)象
斤富,數(shù)組
,函數(shù)
)锻狗。
強(qiáng)制轉(zhuǎn)換
Number:可以將任意類(lèi)型數(shù)據(jù)轉(zhuǎn)換成number
類(lèi)型满力。
基本類(lèi)型轉(zhuǎn)換為number類(lèi)型
轉(zhuǎn)換類(lèi)型 | 結(jié)果(number) | 備注 |
---|---|---|
100 | 100 | |
'100' | 100 | |
' ' | 0 | 空字符和空格都被轉(zhuǎn)成0 |
'100abc' | NaN | 區(qū)別于parseInt('100abc')=100,Number更嚴(yán)格 |
true | 1 | |
false | 0 | |
null | 0 | 區(qū)別于undefined,需特別注意 |
undefined | NaN |
引用類(lèi)型轉(zhuǎn)換為number類(lèi)型
,轉(zhuǎn)換規(guī)則如下:
- 調(diào)用對(duì)象自身的
valueOf
方法轻纪。如果返回原始類(lèi)型的值油额,則直接對(duì)該值使用Number
函數(shù),不再進(jìn)行后續(xù)步驟; - 如果
valueOf
方法返回的還是對(duì)象刻帚,則改為調(diào)用對(duì)象自身的toString
方法潦嘶。如果toString
方法返回原始類(lèi)型的值,則對(duì)該值使用Number
函數(shù)崇众,不再進(jìn)行后續(xù)步驟衬以。 - 如果
toString
方法返回的是對(duì)象,就報(bào)錯(cuò)校摩。
(這里看峻,valueOf方法優(yōu)先于toString調(diào)用
,示例如下)
var obj = {
valueOf: function() {
return 111;
},
toString: function() {
return 222;
}
}
Number(obj); // 111
轉(zhuǎn)換類(lèi)型 | 結(jié)果(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():可以將任意類(lèi)型的值轉(zhuǎn)化成string
類(lèi)型。
基本類(lèi)型轉(zhuǎn)換為string類(lèi)型
轉(zhuǎn)換類(lèi)型 | 結(jié)果(string) | 備注 |
---|---|---|
100 | '100' | |
'100' | '100' | |
true | 'true' | |
false | 'false' | |
null | 'null' | |
undefined | 'undefined' |
引用類(lèi)型轉(zhuǎn)換為string類(lèi)型
,轉(zhuǎn)換規(guī)則如下:
- 先調(diào)用對(duì)象自身的toString方法衙吩。如果返回原始類(lèi)型的值互妓,則對(duì)該值使用String函數(shù),不再進(jìn)行以下步驟坤塞。
- 如果toString方法返回的是對(duì)象冯勉,再調(diào)用原對(duì)象的valueOf方法。如果valueOf方法返回原始類(lèi)型的值摹芙,則對(duì)該值使用String函數(shù)灼狰,不再進(jìn)行以下步驟。
- 如果valueOf方法返回的是對(duì)象浮禾,就報(bào)錯(cuò)交胚。
(這里,toString方法優(yōu)先于valueOf調(diào)用
,示例如下)
var obj = {
valueOf: function() {
return 111;
},
toString: function() {
return 222;
}
}
String(obj); // 222
轉(zhuǎn)換類(lèi)型 | 結(jié)果(string) | 備注 |
---|---|---|
[] | '' |
|
[1] | '1' |
|
[1,2,3] | '1,2,3' |
|
function(){} | 'function(){}' |
|
{} | '[object Object]' |
Boolean():可以將任意類(lèi)型的值轉(zhuǎn)為boolean
類(lèi)型盈电。
轉(zhuǎn)換類(lèi)型 | 結(jié)果(boolean) | 備注 |
---|---|---|
undefined | false |
|
null | false |
|
+0 | false |
|
-0 | false |
|
NaN | false |
|
'' | false |
|
' ' | true |
空格區(qū)別于空字符串 |
其他 | true |
a==b判斷
將等式兩邊都往number
上靠(undefined == null蝴簇,比較特殊)
轉(zhuǎn)換類(lèi)型 | 結(jié)果 | 備注 |
---|---|---|
"" == 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()
強(qiáng)制轉(zhuǎn)換規(guī)則轉(zhuǎn)換
自動(dòng)轉(zhuǎn)換
堅(jiān)持一條原則:預(yù)期什么類(lèi)型,就往該類(lèi)型上靠
匆帚。
- 自動(dòng)轉(zhuǎn)
string
類(lèi)型
'5' + 1 // '51'
'5' + true // "5true"
'5' + false // "5false"
'5' + {} // "5[object Object]"
'5' + [] // "5"
'5' + function (){} // "5function (){}"
'5' + undefined // "5undefined"
'5' + null // "5null"
- 自動(dòng)轉(zhuǎn)
number
類(lèi)型
'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
自動(dòng)轉(zhuǎn)
boolean
類(lèi)型
參考前面Boolean()
強(qiáng)制轉(zhuǎn)換特殊情況
但是熬词,在我進(jìn)行測(cè)試的時(shí)候,發(fā)現(xiàn)了幾個(gè)特殊的例子,{}+1互拾、{}+[] 這兩個(gè)例子在控制臺(tái)打印出的結(jié)果為 1 和 ""歪今,很奇怪是吧?我搜了搜資料發(fā)現(xiàn)颜矿,不同瀏覽器對(duì)其的解析不同寄猩,它會(huì)將前面一個(gè) {} 當(dāng)成代碼塊,于是上面的式子就變成了 +1 和 +[]或衡,所以得出了上面的結(jié)果焦影。
作者:小烜同學(xué)
鏈接:https://juejin.im/post/5a9bd5cf51882555784d675b
來(lái)源:掘金
著作權(quán)歸作者所有车遂。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)封断,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
針對(duì)上面這種例外舶担,我們可以通過(guò)()
運(yùn)算符解決坡疼。
{} + 1
= +1
= 1
(瀏覽器將{}
解析成代碼塊)
({}) + 1
= [object Object]1
[] + {}
= [object Object]
{} +[]
= +[]
= 0
(瀏覽器將{}
解析成代碼塊)
({}) + []
= [object Object]
參考文獻(xiàn)
阮一峰-數(shù)據(jù)類(lèi)型轉(zhuǎn)換
前端小生面試之看不懂的 [ ]+{ }