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

在javascript中通过引用更改对象

在javascript中通过引用更改对象,javascript,object,null,Javascript,Object,Null,考虑以下代码: let obj1 = {foo : 'bar'} let obj2 = obj1 obj2.foo = 'asd' console.log(obj1) // { foo: "asd" } obj2 = null console.log(obj1) // expected null, instead got { foo: "asd" } 如果我理解正确的话,当谈到对象时,让obj2=obj1 javascript实际上并不创建新

考虑以下代码:

let obj1 = {foo : 'bar'}
let obj2 = obj1

obj2.foo = 'asd'
console.log(obj1)   // { foo: "asd" }

obj2 = null
console.log(obj1)   // expected null, instead got { foo: "asd" }
如果我理解正确的话,当谈到对象时,让obj2=obj1 javascript实际上并不创建新对象,而是引用内存中的相同位置,因此是第一个日志的结果

但是,如果obj2设置为null,它实际上会保持原始对象不变。这怎么可能?我的意思是,我希望能够通过obj2修改obj1,或者不能。是什么导致了这种明显的选择性行为?
谢谢

obj1
obj2
在内存中存储对同一对象的引用
obj2=null
仅覆盖存储在
obj2
中的引用,但不修改或覆盖引用的对象变量仅保留对对象的引用。如果更改变量,则表示它指向不同的数据段,而不修改对象。如果你有两张写着我名字的纸,它们都有我的名字。这就是你的变量。如果你把一张纸换成布拉德·皮特,我不会突然变成好莱坞演员。你只有两张纸,上面写着两个不同的人,你不能抹去这张照片。只是它的链接。签出。基本上,您只能通过删除对对象的所有引用(=获取垃圾回收)来删除对象。您不能直接删除对象,而让其他引用什么都不产生。@DBencz您没有遵循类比。如果你有两张写着我名字的纸,那么“画胡子”就相当于“我想在这张纸上的人身上画胡子”。有人(可能是扮演JS引擎的人)去做了。现在这两张纸上仍然提到我,如果你按照每一个参考资料(看看这张纸上的参考资料是谁),你会看到我留着胡子。只有当它们是完全独立的事物而不是对象时,您所更改的图片才起作用。