为了账号安全,请及时绑定邮箱和手机立即绑定

为什么具有对象值的变量总是与对象的值保持同步?

为什么具有对象值的变量总是与对象的值保持同步?

慕哥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是完全一样的。

//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 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号