3 回答

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

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

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