1 回答

TA貢獻1804條經(jīng)驗 獲得超7個贊
我個人是不太喜歡這種問題的,但需要解決這個問題確實需要一些基本功。一般來說,程序?qū)懚嗔?,自然記住了什么情況下會發(fā)生什么樣的事情,但是為什么會發(fā)生這樣的事情,可能問起來一時還真回答不了!
另外,我認為需要對這個問題平個反——它確實涉及到了運算優(yōu)先級。new
是運算符、成員訪問是運算(.
運算符)、函數(shù)調(diào)用是運算……而且題主也給出了 MDN 的鏈接,大家可以看到這個問題中的運算優(yōu)先級基本上集中 17、18、19 上,都是很高的優(yōu)先級。
關(guān)于優(yōu)先級,這里需要說明的一點是,表中同一優(yōu)先級下的多個運算是沒有優(yōu)先順序的,通常是先遇到哪個就先運算哪個,所以說成員訪問優(yōu)先于 new xxx()
并無道理,但是成員訪問的確優(yōu)先于 new xxx
——OK,這里遇到了我認為這個題中是難理解的地方:new Foo.getName()
和 new Foo().getName()
,因為 new
的兩種形式有兩個不同的優(yōu)先級。
new
的兩種形式的運算,一個是帶括號的,稱為帶參數(shù)列表的 new,優(yōu)先級18;另一種是不帶括號的,稱為無參數(shù)列表的 new,優(yōu)先級 17。
所以,雖然 new Foo
是合法的構(gòu)造運算,但是 new Foo.getName()
卻是先運算了 Foo.getName
這個成員訪問運算。為什么呢?因為如果 new Foo
看作一個運算,它的優(yōu)先級是 17,低于成員訪問運算,所以應(yīng)該先計算 Foo.getName
,對其計算結(jié)果再進行 new XXX()
運算。
其它問題都比較容易理解,我就懶得解釋了。希望大家在解決問題的時候盡量少帶情緒(我承認我也經(jīng)常帶情緒,但是俗話說:淡定!)
添加回答
舉報