Skip to main content

前端實驗室

加法和你想的不一樣

前面兩條規則都非常簡單,不會有混淆。對於其他情況,我總結了下面兩條規則:

  1. 當**有一個運算元是複雜資料類型(對象,陣列)**時,將兩個運算元都轉換為字符串(ToString)相加。
  2. 當**有一個運算元是簡單資料類型(true/false, null,undefined)**時,同時不存在複雜資料類型和字符串,則將兩個運算元都轉換成數值(ToNumber)相加。
  3. 另外還有一種特殊情況 + 頭 的相加式,有些瀏覽器會將視為一個塊符號,所以不會參與相加,而是把+符號視為轉換符(Number)將後面的運算元轉換為數值。

我們來看看這幾道題

1.[] + {}

根據規則,[] 和 都是複雜資料類型,滿足有一個運算符是複雜資料類型, 所以將兩個值都轉換為字符串,調用其 toString 方法,得到:

"" + "[object Object]" = "[object Object]"

2.1+{}

同樣滿足第三條規則,結果為

"1" + "[object Object]" = "1[object Object]"

3.'1' + false

其中 false 滿足第 4 條規則,但同時滿足第 2 條規則'1'是字符串,優先處理第 2 條規則。所以處理結果應該是將 false 轉為字符串

"1" + "false" = "1false"

看看題目中的 {} + []

按規則計算結果應該是 "[object Object]"

但是控制台打印出來的結果卻是0,別忘了第 5 條,當+開頭的時候,並不參與計算,只是被單做一個空的代碼塊,所以{}+[]實際上是+[], 即Number([]) => Number("") => 0

那麼{}+{}就是+{},等於Number({}) => Number("[object Object]") => NaN 然而我們看到結果再次出乎我們的意料,控制台輸出的是 [object Object][object Object]

到底是怎麼回事?

原來對於{}+{} 不同瀏覽器會有不同的處理結果,在 chrome 中會輸出"[object Object][object Object]",在 firefox 會輸出NaN。 這應該是不同瀏覽器的 js 引擎解析差異引起的。我們只要記住這個特殊情況就行了。

其實這些特殊值的計算我們平時都很少接觸到,也沒有多大的意義。關鍵還是要加深對 JS 中對數值轉換的理解,以不變應萬變。到真正遇到問題的時候,不至於摸不著頭腦。

javascript - 前端碎碎念 之 [] + + []一样吗? - 前端开发之道 - SegmentFault 思否