Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么具有对象值的变量总是与对象值同步?_Javascript_Variables - Fatal编程技术网

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

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

我感兴趣的是,为什么在代码段B中,当y的初始化发生在x的重新分配之前时,y能够在x被重新分配之后捕获x的值

我被告知原因是,在代码段B中,x是一种引用数据类型——它的值存储在变量/标识符的外部,而变量/标识符正好指向外部内存的地址

然而,我仍然可以说,在初始化y时的特定“时间”,x仍然是{5},所以y应该是{5}。在这里,我必须了解更多的东西——可能与JavaScript为变量赋值的顺序/时间有关

A x=5; y=x; x=6; console.logx;
精神病学 嗯。。。太长,读不下去了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改变对象之后。如果它发生在突变之前,它就会像我预期的那样注销。然而,你对参考资料的解释确实为我巩固了这个概念——谢谢!