我测试了 JavaScript 对象在 Chrome 控制台中的行为方式。可以肯定地说这在任何地方都适用吗? :
a = new Object()
>> Object {}
b = a
>> Object {}
a.boo = "Yiss!"
>> "Yiss!"
b
>> Object {boo: "Yiss!"}
a = new Object()
>> Object {}
b
>> Object {boo: "Yiss!"}
a = b
>> Object {boo: "Yiss!"}
delete a.boo
>> true
b
>> Object {}
a
>> Object {}
delete a
>> true
a
>> Uncaught ReferenceError: a is not defined
b
>> Object {}
TL;DR
我只是想弄清楚以下陈述是否正确: 在对象的多个副本之一中进行的修改可在该对象的所有副本上使用。如果副本或原始对象被删除或被新对象替换,则不会影响其他副本。
最佳答案
delete
所做的只是从对象中删除属性。它实际上并没有对属性的值做任何事情。
a
和b
相当于window.a
和window.b
,因为它们是全局的, window
是全局对象。因此,delete a
相当于 delete window.a
,它只是从 window
对象中删除 a
属性。
由于 JavaScript 中的变量不存储对象,而是存储对对象的引用,删除
所做的只是删除包含引用<的变量/em> 继续被 b
引用的同一对象。
所以,你的问题本身是有缺陷的,因为它是基于对 JavaScript 中对象语义的错误理解:
If a copy or the original is deleted or replaced by a new object, it doesn't impact other copies.
在此上下文中不存在“副本”或“原件”之类的内容。该对象根本没有被复制。您只需拥有一个由多个变量引用的对象。而且,JavaScript 中不存在显式“删除对象”的概念。
关于javascript - 删除原始对象,同时在 JavaScript 中保留其副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27447176/