
javascript編入集
昨天在群里,激烈的討論著一個很簡單的問題 ( {}+[] ) 輸出什么。其實,只要明白這里 + 是干什么的就很容易知道這個是干什么的實際上就是兩個對象的“加法”
( {}+[] ) // 等價于
({}.toString() + [].toString())
但是為什么會有一個 ( ) 包裹起來呢,還是說為什么這里{ }在前就需要用到它。
在這之前,需要說一下 { }
{ } 它本身代表的含義是 object對象的字面量。但是同時他又代表的是函數(shù)體或者復(fù)合語句塊(block)。比如
function some ()
{ }
// or
if()
{ }
while()
{ }
// or
{ }
雖然換行了,但是這樣寫是沒有錯的。
并且來說,如果單獨的 { } 是作為語句塊來執(zhí)行的,內(nèi)部內(nèi)容等效于 eval 看(block)NOTE 部分
{ var a =1 } //
eval("var a = 1")
但是如果只單獨寫:
{ } + [ ]
如果只寫了一個這個的話,左邊就不能嚴(yán)格的區(qū)分是對象
實際上這句話在解釋的時候被解釋為了兩句:
{};
+[];
所以不管左側(cè)的 {} 是什么內(nèi)容,都不會被右側(cè)的 + 所使用。
但是 加上( )之后,就不是了。
( ) 代表的是表達式。表達式內(nèi)是不主動加;的[1],因此, ( {} + [] ) 就可以得到正確的運算結(jié)果了。
如果反過來,就不會出事:
[] + {}
那是因為 這里的[ ] 并不會被解釋為其他行為,所以不會斷句。就可以正確得到想要的結(jié)果了。
具體的執(zhí)行流程需要看一下AST(Abstract Syntax Tree)[2],同時一款工具 esprima可以查看具體解析內(nèi)容。
先知且為之,后知而食之