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

我感兴趣的是,为什么在片段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);

慕哥6287543
浏览 150回答 3
3回答

湖上湖

嗯... 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 丛林的一个不错的起点

DIEA

在片段 B 中,y也是一个参考。它指向同一个地方x。您有 2 个对同一对象的引用。所以声明后y = x,修改x.oneor的值y.one是完全一样的。

叮当猫咪

来自https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing的精彩(截断)摘录:如果一个变量被传递[给一个函数],就不可能在被调用者的范围内模拟对该变量的赋值。但是,由于函数可以访问与调用者相同的对象(不进行复制),因此调用者可以看到函数内这些对象的突变。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript