Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.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_Object_Prototypal Inheritance - Fatal编程技术网

Javascript 这些变量引用是如何工作的?

Javascript 这些变量引用是如何工作的?,javascript,object,prototypal-inheritance,Javascript,Object,Prototypal Inheritance,有人能解释一下这是怎么回事吗?谢谢 var o = {a:1}; var p = o; o === p; // true; o = Object.create(o); p === o; // false o.b = 2; o.a; // 1 b.a; // 1 o.b; // 2 p.b; // undefined 发生什么事了?尤其是在L4。我将当前范围内的o赋值给赋值的RHS值,其中o仍然指向L1上创建的原始对象。那么Object.create是否锁定在对象本身上,与变量完全无关 var

有人能解释一下这是怎么回事吗?谢谢

var o = {a:1};
var p = o;
o === p; // true;
o = Object.create(o);
p === o; // false
o.b = 2;
o.a; // 1
b.a; // 1
o.b; // 2
p.b; // undefined
发生什么事了?尤其是在L4。我将当前范围内的
o
赋值给赋值的RHS值,其中o仍然指向L1上创建的原始对象。那么Object.create是否锁定在对象本身上,与变量完全无关

var o = {a:1};
var p = o;
到目前为止,有1个对象和2个变量指向它

o = Object.create(o);
此行将变量
o
重新分配给一个新的(空)对象,该对象由
o
原型化

前面的对象,当前是
o
的原型,仍然由
p
引用

该字段的内容如下所示:

o.a; // 1 - found in o's prototype (p)
b.a; // 1 - you probably meant p.a? found in p directly
o.b; // 2 - found in o directly
p.b; // not found in p or anywhere in p's prototype chain
到目前为止,有1个对象和2个变量指向它

o = Object.create(o);
此行将变量
o
重新分配给一个新的(空)对象,该对象由
o
原型化

前面的对象,当前是
o
的原型,仍然由
p
引用

该字段的内容如下所示:

o.a; // 1 - found in o's prototype (p)
b.a; // 1 - you probably meant p.a? found in p directly
o.b; // 2 - found in o directly
p.b; // not found in p or anywhere in p's prototype chain

这是一个显示DeepCopy和ShallowCopy之间差异的示例

对象是引用的类型。意味着当im创建对象x时,x只指向对象实际所在的内存(如0x0003f3)

默认情况下,引用的类型化对象指定(例如对象x=a)是浅的 这意味着当我有两个被引用的类型化对象,比如o和p 当我赋值时,p==0:两个值都引用同一个对象! 助理仅复制内存偏移量,而不复制真实对象

这意味着你在“p”上所做的每一个改变也会反映到“o”。 o==p为True,因为两者都持有相同的指针


在第4行:o指向不同的对象,其余的只是显示对“o”的更改不会反映到“p”,因为它们不再指向内存中的同一个对象

对象是引用的类型。意味着当im创建对象x时,x只指向对象实际所在的内存(如0x0003f3)

默认情况下,引用的类型化对象指定(例如对象x=a)是浅的 这意味着当我有两个被引用的类型化对象,比如o和p 当我赋值时,p==0:两个值都引用同一个对象! 助理仅复制内存偏移量,而不复制真实对象

这意味着你在“p”上所做的每一个改变也会反映到“o”。 o==p为True,因为两者都持有相同的指针


在第4行:o指向一个不同的对象,其余的只是表示对“o”的更改不会反映到“p”,因为它们不再指向内存中的同一个对象

我可以想象有人会困惑,为什么重新分配时p没有随o更改

你把p赋值给o,你会认为p是对o的引用,因为变异o会变异p,但重新赋值o不会重新赋值p(所以不是通过引用?)


我认为这是因为JS分配并传递了一个引用值。有些人告诉你,在JS中引用是不可能的,JS总是按值传递。如果这是真的,那么您将无法改变传递/分配的值。我认为Python的行为方式是相同的。

我可以想象有人对为什么重新分配时p没有随o改变感到困惑

你把p赋值给o,你会认为p是对o的引用,因为变异o会变异p,但重新赋值o不会重新赋值p(所以不是通过引用?)


我认为这是因为JS分配并传递了一个引用值。有些人告诉你,在JS中引用是不可能的,JS总是按值传递。如果这是真的,那么您将无法改变传递/分配的值。我认为Python的行为也是如此。

当然b.a=undefined???
b.a
将是
ReferenceError
,我假设OP的意思是
p.a
当然b.a=undefined???
b.a
将是
ReferenceError
,我假设OP的意思是
p.a
这里根本没有发生复制。你所描述的(
p
o
指的是同一个对象)与浅拷贝或深拷贝无关。如果我有一个对象
a
和一个空的、不同的(!)对象
b
,我会将所有属性从
a
复制到
b
。深度复制将涉及递归地执行此操作,以便对象的值也被“克隆”。这里根本不进行复制。你所描述的(
p
o
指的是同一个对象)与浅拷贝或深拷贝无关。如果我有一个对象
a
和一个空的、不同的(!)对象
b
,我会将所有属性从
a
复制到
b
。深度复制将涉及递归地执行此操作,以便对象的值也被“克隆”。您好,Felix,这个“问题”是由JS传递/分配引用值引起的吗?因此,如果将变量分配给对象,则可以通过变量对该对象进行变异,但不能通过重新分配变量来重新分配对象。对此不是100%确定,但我认为有些人会感到困惑,因为在某些语言中,您严格按照值(不能变异)或引用(可以重新分配)分配/传递。我不确定我是否遵循了您的想法。我认为这只是一个关于对象如何工作的普遍困惑。在Java或Python中,您也会遇到同样的问题。人们似乎没有意识到,在一种情况下,他们正在处理该值,例如对其进行变异(
foo.bar=42;
),而在另一种情况下,他们正在修改保存该值的容器(
foo=42;
)。这大概和你想的方向一致吗?是的,你一针见血。例如:
org=[];复制=组织
通过修改copy
copy.push(“新建”),可以通过copy更改组织;复制[1]=“另一个”但可以