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
Javascript 为什么更改对象引用的值不会';你不会真的改变对象吗?_Javascript - Fatal编程技术网

Javascript 为什么更改对象引用的值不会';你不会真的改变对象吗?

Javascript 为什么更改对象引用的值不会';你不会真的改变对象吗?,javascript,Javascript,请参见以下示例: const obj={a:{} 设aOfObj=obj.a console.log(obj.a==aOfObj) aOfObj.b=4 console.log(obj.a.b==aOfObj.b) aOfObj={} console.log(obj.a==aOfObj)下图中的每个矩形表示一个对象 const obj={a:{}正在内存中创建对象{a:{},并将其引用分配给变量obj 让aOfObj=obj.a将内部对象a的引用赋值给变量aOfObj 由于aOfObj和o

请参见以下示例:

const obj={a:{}
设aOfObj=obj.a
console.log(obj.a==aOfObj)
aOfObj.b=4
console.log(obj.a.b==aOfObj.b)
aOfObj={}

console.log(obj.a==aOfObj)
下图中的每个矩形表示一个对象

const obj={a:{}
正在内存中创建对象
{a:{}
,并将其引用分配给变量
obj

让aOfObj=obj.a
将内部对象
a
的引用赋值给变量
aOfObj

由于
aOfObj
obj.a
引用同一对象,因此更改
aOfObj
引用的对象也将反映在
obj.a
上,因为它们是同一对象

现在,当您执行
aOfObj={}
时,您正在创建一个新对象(在内存中)并将其引用分配给
aOfObj
,因此
obj.a
aOfObj
指向不同的对象

注意:

变量和对象都存储在内存中。变量(上面左侧的所有内容)存储在上,而对象(上面右侧的所有内容)存储在上

使用基本值(如数字、字符串等)时,变量存储在堆栈上,其值就是基本值本身。例如:
设n=5
正在堆栈上创建一个变量
n
,并将其值设置为文本数
5

使用对象(对象、数组、类实例等)时,变量存储在堆栈上,而对象存储在堆上(因为堆栈较小),引用(内存中该对象的地址)存储为堆栈上变量的值。例如:
let o={}
在堆栈上创建变量
o
,在堆上创建对象
{}
,并将堆栈上
o
的值设置为该对象的地址,该地址是一个数字(最终保持堆栈较小)


在javascript中,与其他一些语言不同,变量本身不能被引用,只有作为对象的值才能被引用,这就是为什么。

下图中的每个矩形表示一个对象

const obj={a:{}
正在内存中创建对象
{a:{}
,并将其引用分配给变量
obj

让aOfObj=obj.a
将内部对象
a
的引用赋值给变量
aOfObj

由于
aOfObj
obj.a
引用同一对象,因此更改
aOfObj
引用的对象也将反映在
obj.a
上,因为它们是同一对象

现在,当您执行
aOfObj={}
时,您正在创建一个新对象(在内存中)并将其引用分配给
aOfObj
,因此
obj.a
aOfObj
指向不同的对象

注意:

变量和对象都存储在内存中。变量(上面左侧的所有内容)存储在上,而对象(上面右侧的所有内容)存储在上

使用基本值(如数字、字符串等)时,变量存储在堆栈上,其值就是基本值本身。例如:
设n=5
正在堆栈上创建一个变量
n
,并将其值设置为文本数
5

使用对象(对象、数组、类实例等)时,变量存储在堆栈上,而对象存储在堆上(因为堆栈较小),引用(内存中该对象的地址)存储为堆栈上变量的值。例如:
let o={}
在堆栈上创建变量
o
,在堆上创建对象
{}
,并将堆栈上
o
的值设置为该对象的地址,该地址是一个数字(最终保持堆栈较小)


在javascript中,与其他一些语言不同,变量本身不能被引用,只有作为对象的值才能被引用,这就是为什么。

因此,在C++中需要所谓的双指针,因为您更改了aOfObj引用的对象,而没有更改仍然引用前一个对象的obj.a引用的对象。“So
aOfObj
是对
obj.a
的引用”-
aOfObj
存储了
obj.a
可以在内存中找到的“地址”。那么为什么设置
aOfObj={}
。。。“-这只是在
aOfObj
中存储另一个地址。其工作方式与执行
foo=0完全相同;foo=42
您没有将0更改为42,但是您正在更改变量
foo
的内容,因此您需要在C++中使用所谓的双指针,因为您更改了aOfObj引用的对象,而没有更改仍然引用前一个对象的obj.a引用的对象。“So
aOfObj
是对
obj.a
的引用”-
aOfObj
存储了
obj.a
可以在内存中找到的“地址”。那么为什么设置
aOfObj={}
。。。“-这只是在
aOfObj
中存储另一个地址。其工作方式与执行
foo=0完全相同;foo=42您并没有将0更改为42,但您正在更改变量
foo
的内容,为什么您要重新打开这个问题,这个问题已经作为您在自己的答案中引用的副本关闭?这并没有添加任何新内容。即使是这样,也应该被添加到被骗目标中。@Andreas我的错。我只去了第一家,发现了o