JavaScript 裏面不一樣的類型作加法以前,須要作各類轉換,這裏作一個比較完善的總結。javascript
運算雙方存在對象時java
若是有一個對象,那麼先把它轉換成基本類型值數組
轉換以後,若是有字符串,另外一個值先轉換成字符串,而後再作鏈接操做code
若是沒有,把兩者轉換成數字再相加對象
若是兩者都是基本類型值,先檢查是否有字符串類型,若是有就作鏈接操做;若是沒有,就把兩者轉換成數字相加。ip
若是是 Date 對象,那麼用toString()
字符串
其它狀況下,用valueOf()
get
其餘狀況下(valueOf()
不存在或者不返回基本類型值),那麼用toString()
it
var result = 1 + '5' // 15
兩者都是基本類型值,且有字符串,所以作鏈接操做。io
var result = [1, 3, 5] + 1 // "1, 3, 51"
數組是引用類型,先用valueOf()
進行轉換,可是數組的valueOf()
的結果仍是原來的數組,因此用toString()
方法獲得一個字符串"1, 3, 5"
;而後是一個字符串加一個數字,作鏈接操做。
var result = 10 + true // 11
兩者都是基本類型值,且沒有字符串,因此把true
轉換成數字相加。
var result = 15 + {} // "15[object Object]"
首先對對象作轉換,對象的valueOf
仍是自身,因此用toString()
來轉換,{}.toString()
的結果是"[object Object]"
,因此最後的結果就是"15[object Object]"
。
var result = 8 + null // 8
null 轉爲0,再作加法運算。
var result = "queen" + null // "queennull"
undefined
var result = 12 + undefined // NaN
把undefined
轉換成數字,獲得NaN
,所以加法的結果就是NaN
。
var result = [] + {} // "[object Object]"
兩者都是對象,並且兩者的valueOf
方法的結果都是自身,因此要調用toString
方法。空數組調用的結果是個空字符串,空對象調用的結果是"[object Object]"
, 字符串鏈接以後的結果就是"[object Object]"
。
var result = {} + [] // 0
在這裏,{}
被解析成一個空的 block,所以實際上解析成這樣:
{ // empty block } + []
就是把一個空數組轉換成數值,調用valueOf
以後仍是自身,所以調用toString
, 獲得一個空字符串,轉換成數字0。
參考: