JS中{}+[]和[]+{}的返回值情況是怎樣的?
01-20
還有其中的原因是什麼呢?
先說 [] + {} 。一個數組加一個對象。
加法會進行隱式類型轉換,規則是調用其 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 |