Javascript 为什么具有对象值的变量总是与对象值同步?
我感兴趣的是,为什么在代码段B中,当y的初始化发生在x的重新分配之前时,y能够在x被重新分配之后捕获x的值 我被告知原因是,在代码段B中,x是一种引用数据类型——它的值存储在变量/标识符的外部,而变量/标识符正好指向外部内存的地址 然而,我仍然可以说,在初始化y时的特定“时间”,x仍然是{5},所以y应该是{5}。在这里,我必须了解更多的东西——可能与JavaScript为变量赋值的顺序/时间有关 A x=5; y=x; x=6; console.logx;Javascript 为什么具有对象值的变量总是与对象值同步?,javascript,variables,Javascript,Variables,我感兴趣的是,为什么在代码段B中,当y的初始化发生在x的重新分配之前时,y能够在x被重新分配之后捕获x的值 我被告知原因是,在代码段B中,x是一种引用数据类型——它的值存储在变量/标识符的外部,而变量/标识符正好指向外部内存的地址 然而,我仍然可以说,在初始化y时的特定“时间”,x仍然是{5},所以y应该是{5}。在这里,我必须了解更多的东西——可能与JavaScript为变量赋值的顺序/时间有关 A x=5; y=x; x=6; console.logx; 精神病学 嗯。。。太长,读不下去了j
精神病学 嗯。。。太长,读不下去了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 = { two : 5}
这根本不会影响X,只会用一个全新的对象值重新分配y
这与javascript如何处理引用和赋值有关。
看看ref丛林的一个不错的起点好吧。。。太长,读不下去了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 = { two : 5}
这根本不会影响X,只会用一个全新的对象值重新分配y
这与javascript如何处理引用和赋值有关。
在代码段B中,可以找到ref jungle的一个很好的起点,y也是一个参考。它指向与x完全相同的位置。对同一对象有两个引用
所以在声明y=x之后,修改x.one或y.one的值是完全一样的。
在代码段B中,y也是一个参考。它指向与x完全相同的位置。对同一对象有两个引用
所以在声明y=x之后,修改x.one或y.one的值是完全一样的。
一段精彩的节选自: 如果变量[传递给函数],则不可能在被调用方的作用域中模拟对该变量的赋值。但是,由于函数可以访问与调用方相同的对象,因此不会进行复制,因此调用方可以看到函数中这些对象的变化
这是一段很好的截短摘录,摘自: 如果变量[传递给函数],则不可能在被调用方的作用域中模拟对该变量的赋值。但是,由于函数可以访问与调用方相同的对象,因此不会进行复制,因此调用方可以看到函数中这些对象的变化
第一个是赋值,第二个是引用赋值。您正在更改引用的源,x.one=6;这回答了你的问题吗@tonitone110没有返回更新其他变量的方法:无论您是执行x.one=6还是y.one=6,您都在修改相同的单个值,x和y只是指向它的两个引用。@sp00m我想我现在明白了。我把自己弄糊涂了,因为我希望y注销{one:5},但是console.logy发生在x改变对象之后。如果它发生在突变之前,它就会像我预期的那样注销。然而,你对参考资料的解释确实为我巩固了这个概念——谢谢!第一个是赋值,第二个是引用赋值。您正在更改引用的源,x.one=6;这回答了你的问题吗@tonitone110没有返回更新其他变量的方法:无论您是执行x.one=6还是y.one=6,您都在修改相同的单个值,x和y只是指向它的两个引用。@sp00m我想我现在明白了。我把自己弄糊涂了,因为我希望y注销{one:5},但是console.logy发生在x改变对象之后。如果它发生在突变之前,它就会
像我预料的那样注销。然而,你对参考资料的解释确实为我巩固了这个概念——谢谢!谢谢@MKougiouris。请看我的第三段-我的问题是JS如何能够“返回”到y并不断地将其更新为新的x值?好的,那么现在主要的问题是:因为根据我们所说的,你没有重新分配y或x,你只是从x中变异1个字段。所以y引用x,你可以从x中变异属性。但是当你说y={some:thing}的时候,引用被破坏了,y是它自己的,我想我现在明白了。我把自己弄糊涂了,因为我希望y注销{one:5},但是console.logy发生在x改变对象之后。如果它发生在突变之前,它就会像我预期的那样注销。然而,你对参考资料的解释确实为我巩固了这个概念——谢谢!谢谢@MKougiouris。请看我的第三段-我的问题是JS如何能够“返回”到y并不断地将其更新为新的x值?好的,那么现在主要的问题是:因为根据我们所说的,你没有重新分配y或x,你只是从x中变异1个字段。所以y引用x,你可以从x中变异属性。但是当你说y={some:thing}的时候,引用被破坏了,y是它自己的,我想我现在明白了。我把自己弄糊涂了,因为我希望y注销{one:5},但是console.logy发生在x改变对象之后。如果它发生在突变之前,它就会像我预期的那样注销。然而,你对参考资料的解释确实为我巩固了这个概念——谢谢!谢谢@dgiugg。我知道y也是一个参考人。请看我的第三段——我的问题是JS如何能够“返回”到y并不断地将其更新为新的x值?它不会返回。它不是x的值。有一个对象,独立于x和y。有两个参照,x和y,指向同一个对象。通过称它为x或y来改变那个对象是严格等价的。我想我现在明白了。我把自己弄糊涂了,因为我希望y注销{one:5},但是console.logy发生在x改变对象之后。如果它发生在突变之前,它就会像我预期的那样注销。然而,你对参考资料的解释确实为我巩固了这个概念——谢谢!谢谢@dgiugg。我知道y也是一个参考人。请看我的第三段——我的问题是JS如何能够“返回”到y并不断地将其更新为新的x值?它不会返回。它不是x的值。有一个对象,独立于x和y。有两个参照,x和y,指向同一个对象。通过称它为x或y来改变那个对象是严格等价的。我想我现在明白了。我把自己弄糊涂了,因为我希望y注销{one:5},但是console.logy发生在x改变对象之后。如果它发生在突变之前,它就会像我预期的那样注销。然而,你对参考资料的解释确实为我巩固了这个概念——谢谢!