2011-01-23 130 views

回答

11

+concatenation operator導致0toString評估。

因爲a的值是"0",而b的值是0

的ECMAScript 11.6.1加法運算符(+)

加法運算或者執行字符串連接或數字加法。生產AdditiveExpression:

  1. 令LREF是評估AdditiveExpression的結果:AdditiveExpression + MultiplicativeExpression如下評價。

  2. 讓lval成爲GetValue(lref)。

  3. 讓rref是評估乘法表達式的結果。

  4. 設rval爲GetValue(rref)。

  5. 讓lprim ToPrimitive(lval)。

  6. 設rprim爲ToPrimitive(rval)。

  7. 如果Type(lprim)是字符串或類型(rprim)是字符串,然後

    一個。返回串聯ToString(lprim)後跟ToString(rprim)的字符串

  8. 返回對ToNumber(lprim)和ToNumber(rprim)應用加法運算的結果。請參閱下面的註釋 11.6.3。

注1沒有暗示設置在調用ToPrimitive在步驟5個6除日期對象中的所有天然的ECMAScript對象處理沒有一個提示的彷彿暗示編號給予;日期對象處理缺少提示,就像提供了提示字符串一樣。主機對象可能會以其他方式處理缺少提示。

注2步驟7不同於關係運算符(11.8.5)的比較算法的步驟3,通過使用邏輯或操作而不是邏輯和操作。

3

[] + 0是一個字符串。
當您在Javascript中編寫a + b時,引擎會將ab轉換爲原語。
如果至少有一個生成的基元是一個字符串,它將執行字符串連接;否則,它將執行數字加法。

要將對象(如數組)轉換爲基元,引擎將調用valueOf(),如果其結果不是基元,則將調用toString()
對於數組,valueOf()返回原始數組(不是原語),toString()返回數組內容的以逗號分隔的字符串。因此,[] + 0變成"" + 0,即"0"

非空字符串永遠不會是錯的。

相關問題