十、{ } 、 ( )有話說

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)容。

先知且為之,后知而食之


  1. 添加;的行為只在語句的末尾添加,如果下一行可以與上一行連用,則不會加。因為js是會被壓縮到一行的,解釋器為了解釋所以會主動進行斷句。 ?

  2. 抽象語法樹,將js的源文件解釋為可以執(zhí)行的語法樹,標(biāo)注每一個語句的具體內(nèi)容 ?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容