標籤:

JS中{}+[]和[]+{}的返回值情況是怎樣的?

還有其中的原因是什麼呢?


先說 [] + {} 。一個數組加一個對象。

加法會進行隱式類型轉換,規則是調用其 valueOf() 或 toString() 以取得一個非對象的值(primitive value)。如果兩個值中的任何一個是字元串,則進行字元串串接,否則進行數字加法。

[] 和 {} 的 valueOf() 都返回對象自身,所以都會調用 toString(),最後的結果是字元串串接。[].toString() 返回空字元串,({}).toString() 返回「[object Object]」。最後的結果就是「[object Object]」。

然後說 {} + [] 。看上去應該和上面一樣。但是 {} 除了表示一個對象之外,也可以表示一個空的 block。在 [] + {} 中,[] 被解析為數組,因此後續的 + 被解析為加法運算符,而 {} 就解析為對象。但在 {} + [] 中,{} 被解析為空的 block,隨後的 + 被解析為正號運算符。即實際上成了:

{ // empty block }

+[]

即對一個空數組執行正號運算,實際上就是把數組轉型為數字。首先調用 [].valueOf() 。返回數組自身,不是primitive value,因此繼續調用 [].toString() ,返回空字元串。空字元串轉型為數字,返回0,即最後的結果。


謝邀,不知道,也沒興趣知道。


{}+[] 如果被parse成statement的話,{}會被parse成空的block,但是在需要被parse成expression的話,就會被parse成空的Object。所以{}+[]和console.log({}+[])的輸出結果還不一樣,因為參數列表只接受expression。


提問之前請擅用google:

中文地址:http://www.cnblogs.com/ziyunfei/archive/2012/09/15/2685885.html

英文原文:http://www.2ality.com/2012/01/object-plus-object.html


找了個解析js工具


首先贊同 @賀師俊同學的回答。然後我貼張圖,算是驗證吧。類似這種問題,打開控制台就能找到答案。


應該還有很多人記得這個笑話吧~Wat:只有程序員能看懂的搞笑視頻

裡面有一部分就是在調侃JS的這一結果。


推薦閱讀:

用d3.js或jfreechart在web上做圖表,哪個比較好,他們的區別在哪,哪個國內用的比較多?
前端如何處理動態url?
亞馬遜是如何反爬蟲的?
Python 爬蟲如何獲取 JS 生成的 URL 和網頁內容?
如何看待 AWS Lambda ?

TAG:JavaScript |