2017-08-03 60 views
0

在JavaScript中,我們有{} + [] // 0但是({}+[]) // "[object Object]"。 據我所知,在第一個例子中,JS解析{}作爲一個空的塊,所以剩下的+ [],在這一點上它調用toNumber(toPrimitive([])),這是0.但我不明白如何通過添加括號這種變化。括號是否會阻止JS將{}評估爲空白塊,然後將其轉換爲其原始類型,也就是一個字符串?JavaScript括號對添加期間類型轉換的影響

+0

添加括號可以將其評估爲對象文字而不是代碼塊。這個技巧用於[ECMAScript6箭頭函數返回一個對象](// stackoverflow.com/q/28770415) – 4castle

回答

1

當添加圓括號改變對以下標記的解析時,JavaScript中有許多情況。函數聲明與函數表達式是另一個例子。

這是一個語法錯誤:

function() { 
    // stuff 
}() 

但這是一個IIFE(立即調用的函數表達式):

(function() { 
    // stuff 
})() 

在這種情況下,括號導致JavaScript來解釋大括號作爲對象字面值而不是空白塊。當與二元運算符一起使用時,對象被強制轉換爲它們的字符串表示形式。添加字符串時,數組被強制爲空字符串。

{} + {} // "[object Object][object Object]" 
'foo' + [] // "foo" 
({} + []) // "[object Object]" 

括號沒有引起{}成爲一個字符串,但加號一樣。

+0

在某些情況下,{} + {}'打印'NaN'。它取決於REPL是否選擇將第一個「{}」解析爲對象字面值。 – 4castle