2 回答

TA貢獻1946條經(jīng)驗 獲得超3個贊
a被覆蓋重新賦值,所以a指向一個新的空間。
當b=a,a和b同時指向同一個空間,如果改變空間內(nèi)的值,如a.name="b",則a和b同時改變b.name="b"。
但a被重新賦對象值,所以a指向了新的空間,b仍然指向原來的空間。

TA貢獻1829條經(jīng)驗 獲得超4個贊
沒有所謂的優(yōu)劣。基本上看你的語言應該是javascript,而javascript本身并非編譯語言,而是翻譯語言。它并不是oopl之一,其核心還是利用的數(shù)組機制而實現(xiàn)oop的風格。
所以在面向?qū)ο笾腥髮傩缘姆庋b方向并沒有嚴格的控制,所謂的對象其實核心是一個數(shù)組(可以理解為計算機屬語中的廣義表),使用.的方式來實現(xiàn)數(shù)組調(diào)用方式,這樣使用javascript看起來是一個oopl,只是形似而已。
所以var a = {}; a.b =‘C';與var a = {}; a['b']='c',其實沒有區(qū)別的,只是前者在格式上更象面向?qū)ο蠖?。或者你可以認為.調(diào)用就是數(shù)組調(diào)用的語法糖。所以兩者沒有任何區(qū)別的。當然,誰優(yōu)誰略在本質(zhì)上是沒有區(qū)別,但代碼閱讀習慣上來看,前者適用了oop風格,而后者只是數(shù)組或廣義表的理解——除此之外沒有差異。
最后一種我們多見于序列化,如松散形數(shù)據(jù)傳遞(JSON/JSONP)格式中常見。等于直接的寫法,本質(zhì)上來說,你聲明數(shù)組后賦值,或在聲明數(shù)組的同時賦值也沒有區(qū)別的。類似的情況是var a = 5;與var a; a=5;的區(qū)別一樣,沒有區(qū)別。
所以三者在javascript中沒有區(qū)別,只是形式上變形,適合于不同的場景下而已。所以第一種情況是對象風格編程,第二種是用來處理精數(shù)組(不管何種風格),第三種是對象序列化(json.jsonp).
這里要說明一個python,他是一個編譯語言,但是它是動態(tài)語言。所謂的動態(tài)語言指的就是可動態(tài)變化。C#靜態(tài)語言聲明一個類,編譯時你可以定義任何屬性或方法,而在運行時只能使用這個屬性或方法,不能再添加了。而python等動態(tài)語言上來說,編譯時你可以定義,同時在運行時可能隨時增加屬性或方法也可以清除某個運行類的屬性或方法。javascript類風格與此相似——但是翻譯型語言只有運行態(tài),并沒有編譯態(tài),也就是說他是直接翻譯源碼運行的,不是似編譯語言要生成程序或中間態(tài)語言(.net生成是的msil),所以兩者還是有很多區(qū)別的。不過隨著ecmascript標準的建立,使用此類語言(ECMAScript語言樹)中已經(jīng)具有很強大的功能了。
- 2 回答
- 0 關(guān)注
- 219 瀏覽
添加回答
舉報