[英]Can someone explain this behavior in javascript?
在Firefox中測試:
a = [] + 0;
b = 0;
alert(a); // 0
alert(b); // 0
alert(!a); // false
alert(!b); // true
+
連接運算符導致toString
評估為0
。
因此, a
值為"0"
,而b
值為0
。
來自ECMAScript 11.6.1加法運算符(+)
加法運算符執行字符串連接或數字加法。 生產AdditiveExpression:AdditiveExpression + MultiplicativeExpression的計算方法如下:
讓lref成為評估AdditiveExpression的結果。
設lval為GetValue(lref)。
設rref是評估MultiplicativeExpression的結果。
設rval為GetValue(rref)。
設lprim為ToPrimitive(lval)。
設rprim為ToPrimitive(rval)。
如果Type(lprim)是String或Type(rprim)是String,那么
一個。 返回串聯ToString(lprim)后跟ToString(rprim)的結果的字符串
將添加操作的結果返回到ToNumber(lprim)和ToNumber(rprim)。 見11.6.3下面的注釋。
注1:在步驟5和6中對ToPrimitive的調用中沒有提供提示。除Date對象之外的所有本機ECMAScript對象都處理沒有提示,就像提供了提示號一樣; 日期對象處理缺少提示,就像提供了提示字符串一樣。 主機對象可以以某種其他方式處理缺少提示。
注2:步驟7與關系運算符(11.8.5)的比較算法的步驟3的不同之處在於,使用邏輯或運算代替邏輯運算。
[] + 0
是一個字符串。
當您在Javascript中編寫a + b
時,引擎會將a
和b
都轉換為基元。
如果至少有一個結果基元是一個字符串,它將執行字符串連接; 否則,它將執行數字加法。
要將對象(例如數組)轉換為基元,引擎將調用valueOf()
,如果其結果不是基元,則將調用toString()
。
對於數組, valueOf()
返回原始數組(不是基元), toString()
返回數組內容的逗號分隔字符串。
因此, [] + 0
變為"" + 0
,即"0"
。
非空字符串永遠不會偽造。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.