亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么具有對象值的變量總是與對象的值保持同步?

為什么具有對象值的變量總是與對象的值保持同步?

慕哥6287543 2022-10-21 17:29:50
我感興趣的是,為什么在片段B中,當y的初始化發生x在重新分配.xyx有人告訴我原因是因為在代碼片段 B 中,x它是一個參考數據類型——它的值存儲在變量/標識符的外部,并且該變量/標識符只是指向外部存儲器的地址。但是我仍然可以爭辯說,在y初始化的特定“時間”,x仍然應該{5}如此。我必須在這里理解更多的東西——也許與 JavaScript 為變量賦值的順序/時間有關......y{5}一個x = 5;y = x;x = 6;console.log(x);console.log(y);乙x = {one: 5};y = x;x.one = 6;console.log(x);console.log(y);
查看完整描述

3 回答

?
湖上湖

TA貢獻2003條經驗 獲得超2個贊

嗯... tldr; javascript很古怪!


本質上,在您的第一個片段中:


Assign value of, x = 5;

Assign value of, y = x, which holds a reference to the primitive value 5, so y is now directly 5, not x's reference.

Assign value of, x = 6, direct value again, removes the previous correlation with x and y.

發生上述情況是因為您的分配涉及原始類型。當您說 y=x 時,您將原語 5 分配給 y,而不是對 x 的引用,這正是因為 X 擁有一個原語,而不是一個對象。


另一方面,您的第二種情況涉及對象,而是通過引用傳遞。


因此,在“此處”進行更改實際上會影響指向“此處”的所有引用


x = {one : 5}

y = x -> This now is an assignment by passing the reference value, i.e Y points to the same object X is pointing.

x.one = 6; -> this will actually effect the same reference Y has

更進一步,如果我們現在在哪里再次變異 y 呢?


如果我們在您的第二個示例中將此行作為最后一行


y = { two : 5}

這根本不會影響 X,它只會為 y 重新分配一個全新的對象值。


這與 javascript 如何處理引用和賦值有關。在這里看看ref 叢林的一個不錯的起點


查看完整回答
反對 回復 2022-10-21
?
DIEA

TA貢獻1820條經驗 獲得超3個贊

在片段 B 中,y也是一個參考。它指向同一個地方x。您有 2 個對同一對象的引用。

所以聲明后y = x,修改x.oneor的值y.one是完全一樣的。

http://img1.sycdn.imooc.com//635267860001aebc23180805.jpg

查看完整回答
反對 回復 2022-10-21
?
叮當貓咪

TA貢獻1776條經驗 獲得超12個贊

來自https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing的精彩(截斷)摘錄:

如果一個變量被傳遞[給一個函數],就不可能在被調用者的范圍內模擬對該變量的賦值。但是,由于函數可以訪問與調用者相同的對象(不進行復制),因此調用者可以看到函數內這些對象的突變。


查看完整回答
反對 回復 2022-10-21
  • 3 回答
  • 0 關注
  • 156 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號