3 回答

TA貢獻1853條經(jīng)驗 獲得超9個贊
foo.x = foo = {n: 2};
判定foo.x是指一種屬性x的的{n: 1}目的,分配{n: 2}給foo,并分配的新值foo- {n: 2}-為屬性x的的{n: 1}對象。
重要的是,foo這foo.x指的是之前確定foo的變化。
參見ES5規(guī)范的11.13.1節(jié):
令lref為評估LeftHandSideExpression的結(jié)果。
令rref為評估AssignmentExpression的結(jié)果。
賦值運算符從右到左關(guān)聯(lián),因此您得到:
foo.x = (foo = {n: 2})
首先評估左側(cè),然后評估右側(cè)。

TA貢獻1936條經(jīng)驗 獲得超7個贊
foo.x = foo = {n:2};
此處foo指的是賦值之前即執(zhí)行語句之前的{n:1}對象。
該語句可以重寫為foo.x =(foo = {n:2});
在對象方面,以上語句可以重寫為 {n:1} .x =({n:1} = {n:2});
由于分配僅從右到左發(fā)生。因此,這里我們只需要在執(zhí)行開始之前檢查foo是否指向哪個對象。
在解決RHS時: foo = {n:2} ; 現(xiàn)在foo指的是{n:2};
回到我們剩下的問題:
foo.x = foo;
現(xiàn)在,LHS上的foo.x仍然是{n:1} .x,而RHS上的foo是{n:2}。
因此,在執(zhí)行該語句后,{n:1}將變?yōu)閧n:1,x:{n:2}},并且bar仍引用該語句。凡為FOO現(xiàn)在將參照{(diào)N:2} 。
因此,在執(zhí)行foo.x時會給出undefined,因為foo中只有1個值為{n:2}的值。
但是,如果您嘗試執(zhí)行bar.x,它將得到{n:2}。或者,如果您只執(zhí)行bar,結(jié)果將是
對象{n:1,x:對象}

TA貢獻1846條經(jīng)驗 獲得超7個贊
我以為我會添加另一種我認為有用的思考方式。
最后的變量分配等同于write bar.x = foo = {n:2};,因為這些變量只是對內(nèi)存中同一事物的引用。
換句話說,foo和bar首先都引用相同的對象{n:1}。使用時foo.x =,您正在訪問{n:1}該x屬性并將其添加到其中。這可以通過任一方法完成,bar或者foo因為它們都指向內(nèi)存中的同一對象!這沒什么區(qū)別。
然后,當您完成該行時,foo.x = foo = {n:2}您將通過對象文字語法在內(nèi)存中創(chuàng)建另一個全新的對象,并設(shè)置foo為指向該對象{n:2},而不是現(xiàn)在的對象{n:1, x: {n: 2}。但是,這不會影響foo將x屬性添加到該屬性時所指向的內(nèi)容。
這非常令人困惑,但是我認為您可以考慮這樣一個事實,即變量只是指向內(nèi)存中的位置/對象的指針,并且對象文字語法不會更改先前存在的對象(即使它們看起來很相似)。它正在創(chuàng)造一個全新的。
添加回答
舉報