爲何{}+[] != []+{}

要弄明白這個問題首先咱們要了解JS中的類型轉換以及引用類型的轉換,咱們一般把值從一種類型轉化爲另外一種類型稱爲類型轉換,這是顯示的狀況;隱式的狀況稱爲強制類型轉換javascript

1、引用類型的轉換

在JavaScript中強制類型轉換老是返回標量基本類型的值,不會返回對象和函數。java

對於對象(包括數組),爲了將值轉換爲相應基本類型的值,抽象操做ToPrimitive會首先檢查該值是否有valueOf()方法,若是有而且返回基本類型的值,就使用該方法進行強制類型轉換;若是沒有就使用toString()發放進行強制類型轉換,若是valueof()toString()都不存則會報錯。數組

咱們在對象obj一、obj2上面分別定義了 valueOf()toString(),對象先會在本身身上查找這兩個方法,若是有則會覆蓋原型的方法,若是對象沒有這個方法,而後在到原型上查找。

下面這個例子沒有定義上面的兩個方法,則會調用原型鏈上的方法。 函數

下面這個例子中咱們使用Object.create(null)建立了一個對象,它沒有繼承任何原型方法,因爲它的__proto__undefined,自身也沒有定義valueOf()toString()因此在進行強制類型轉換的時候會報錯。 spa

若是咱們給它添加一個valueOf()toString()3d

2、字符串和數字的隱示強制類型轉換

在不少時候咱們常常使用+來進行數字加法和字符串拼接。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

相關文章
相關標籤/搜索