在(至少)Firefox的Web控制檯和JSBin,我得到爲什麼`{} + []`在Javascript中返回與`a = {} + []`不同的結果?
> {} + []
0
> a = {} + []
"[object Object]"
的Node.js返回在這兩種情況下"[object Object]"
。根據規範,哪種行爲是正確的?如果第一個,爲什麼?
在(至少)Firefox的Web控制檯和JSBin,我得到爲什麼`{} + []`在Javascript中返回與`a = {} + []`不同的結果?
> {} + []
0
> a = {} + []
"[object Object]"
的Node.js返回在這兩種情況下"[object Object]"
。根據規範,哪種行爲是正確的?如果第一個,爲什麼?
在瀏覽器的控制檯,當它不是由=
(或改變其上下文一些其他代碼)之前,{}
被視爲塊,而不是一個對象常量。
由於塊是空的,它什麼也不做,只剩下+ []
。
一元加運算符將數組轉換爲數字,即0
。
確實,嘗試'({} + [])'。我不知道我可以在沒有'if/else/do/while/function/etc'的情況下使用'{}'。 – biziclop
對操作對象使用操作符時,javascript解釋器應該使用valueOf方法將值轉換爲原始值,該方法實際上使用內部ToPrimitive函數中繼類型強制轉換爲對象的內部[[DefaultValue]]方法。
你的加運算符的例子有點棘手,因爲運算符可以作爲數學加法或字符串連接。在這種情況下,它會連接對象的字符串表示形式。
什麼是真正發生在幕後是:
a = {}.valueOf().toString() + [].valueOf().toString();
由於數組是空的toString方法返回一個空字符串,這就是爲什麼正確的結果應該是[對象的對象]這是從返回值object.valueOf()的toString()。
比較在哪裏發生? –
對不起,我太快了。 – bfavaretto
Wat? https://www.destroyallsoftware.com/talks/wat –