詳解加法運算符

JavaScript 裏面不一樣的類型作加法以前,須要作各類轉換,這裏作一個比較完善的總結。javascript

基本轉換規則

  1. 運算雙方存在對象時java

    • 若是有一個對象,那麼先把它轉換成基本類型值數組

    • 轉換以後,若是有字符串,另外一個值先轉換成字符串,而後再作鏈接操做code

    • 若是沒有,把兩者轉換成數字再相加對象

  2. 若是兩者都是基本類型值,先檢查是否有字符串類型,若是有就作鏈接操做;若是沒有,就把兩者轉換成數字相加。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";而後是一個字符串加一個數字,作鏈接操做。

數字加 boolean

var result = 10 + true // 11

兩者都是基本類型值,且沒有字符串,因此把true轉換成數字相加。

數字加對象

var result = 15 + {} // "15[object Object]"

首先對對象作轉換,對象的valueOf仍是自身,因此用toString()來轉換,{}.toString()的結果是"[object Object]",因此最後的結果就是"15[object Object]"

數字加 null

var result = 8 + null // 8

null 轉爲0,再作加法運算。

字符串加 null

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。

參考:

相關文章
相關標籤/搜索