要弄明白這個問題首先咱們要了解JS中的類型轉換以及引用類型的轉換,咱們一般把值從一種類型轉化爲另外一種類型稱爲類型轉換,這是顯示的狀況;隱式的狀況稱爲強制類型轉換。javascript
在JavaScript中強制類型轉換老是返回標量基本類型的值,不會返回對象和函數。java
對於對象(包括數組),爲了將值轉換爲相應基本類型的值,抽象操做ToPrimitive
會首先檢查該值是否有valueOf()
方法,若是有而且返回基本類型的值,就使用該方法進行強制類型轉換;若是沒有就使用toString()
發放進行強制類型轉換,若是valueof()
和toString()
都不存則會報錯。數組
valueOf()
和
toString()
,對象先會在本身身上查找這兩個方法,若是有則會覆蓋原型的方法,若是對象沒有這個方法,而後在到原型上查找。
下面這個例子沒有定義上面的兩個方法,則會調用原型鏈上的方法。 函數
下面這個例子中咱們使用Object.create(null)
建立了一個對象,它沒有繼承任何原型方法,因爲它的__proto__
爲undefined
,自身也沒有定義valueOf()
和toString()
因此在進行強制類型轉換的時候會報錯。 spa
若是咱們給它添加一個valueOf()
或toString()
: 3d
在不少時候咱們常常使用+
來進行數字加法和字符串拼接。code
let a = '12'
let b = '10'
let c = 12
let d = 10
let add1 = a + b // '1210'
let add2 = c + d // 22
複製代碼
這裏會獲得兩個不一樣的結果,緣由在於:第一個執行的是字符串拼接的操做,第二個執行的是數字加法操做。cdn
let arr1 = [1,2]
let arr2 = [3,4]
arr1 + arr2 = '1,23,4'
複製代碼
由於上上面的數組經過toString()
方法也能轉換爲字符串因此也是執行字符串拼接操做。對象
在書上這樣寫道:blog
若是某個操做數是字符串或則能經過如下操做轉換爲字符串的話,+將執行字符串拼接操做。若是其中一個操做數是對象(包括數組),則首先對其調用
ToPrimitive
抽象操做,該抽象操做再調用[[DefaultValue]],以數字做爲上下文。
{}+[] != []+{}
咱們先對[]
和{}
進行單獨分析:
[].toString() // ""
+[] // 0 這裏先執行toString()轉換爲"",而後使用 + 執行強制類型轉換爲 0
{}.toString() // "[object Object]"
+{} // NaN
複製代碼
toString()
方法,最後就至關於: "" + "[object Object]"
因此最後結果是:"[object Object]"{}
會被看做是一個獨立的代碼塊,至關於:{
}
+[]
複製代碼
這裏{}
代碼塊不執行任何操做,並且代碼塊結尾不須要分號,因此也不存在語法上的問題,因此在這裏就至關於執行 +[]
,因此最後結果是0.
最後因爲本還在在校學生一名才疏學淺,有什麼問題但願你們提出來,但願與你們一塊兒進步。
參考書籍: 你不知道的JavaScript