在Firefox測試:有人可以在javascript中解釋這種行爲嗎?
a = [] + 0;
b = 0;
alert(a); // 0
alert(b); // 0
alert(!a); // false
alert(!b); // true
在Firefox測試:有人可以在javascript中解釋這種行爲嗎?
a = [] + 0;
b = 0;
alert(a); // 0
alert(b); // 0
alert(!a); // false
alert(!b); // true
+
concatenation operator導致0
的toString
評估。
因爲a
的值是"0"
,而b
的值是0
。
從的ECMAScript 11.6.1加法運算符(+)
加法運算或者執行字符串連接或數字加法。生產AdditiveExpression:
令LREF是評估AdditiveExpression的結果:AdditiveExpression + MultiplicativeExpression如下評價。
讓lval成爲GetValue(lref)。
讓rref是評估乘法表達式的結果。
設rval爲GetValue(rref)。
讓lprim ToPrimitive(lval)。
設rprim爲ToPrimitive(rval)。
如果Type(lprim)是字符串或類型(rprim)是字符串,然後
一個。返回串聯ToString(lprim)後跟ToString(rprim)的字符串
返回對ToNumber(lprim)和ToNumber(rprim)應用加法運算的結果。請參閱下面的註釋 11.6.3。
注1沒有暗示設置在調用ToPrimitive在步驟5個6除日期對象中的所有天然的ECMAScript對象處理沒有一個提示的彷彿暗示編號給予;日期對象處理缺少提示,就像提供了提示字符串一樣。主機對象可能會以其他方式處理缺少提示。
注2步驟7不同於關係運算符(11.8.5)的比較算法的步驟3,通過使用邏輯或操作而不是邏輯和操作。
[] + 0
是一個字符串。
當您在Javascript中編寫a + b
時,引擎會將a
和b
轉換爲原語。
如果至少有一個生成的基元是一個字符串,它將執行字符串連接;否則,它將執行數字加法。
要將對象(如數組)轉換爲基元,引擎將調用valueOf()
,如果其結果不是基元,則將調用toString()
。
對於數組,valueOf()
返回原始數組(不是原語),toString()
返回數組內容的以逗號分隔的字符串。因此,[] + 0
變成"" + 0
,即"0"
。
非空字符串永遠不會是錯的。