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

TA贡献1776条经验 获得超12个赞
来自https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_sharing的精彩(截断)摘录:
如果一个变量被传递[给一个函数],就不可能在被调用者的范围内模拟对该变量的赋值。但是,由于函数可以访问与调用者相同的对象(不进行复制),因此调用者可以看到函数内这些对象的突变。
添加回答
举报