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