删除原始对象,同时在JavaScript中保留其副本
我测试了JavaScript对象在Chrome控制台中的行为。假设这在任何地方都有效,安全吗删除原始对象,同时在JavaScript中保留其副本,javascript,javascript-objects,Javascript,Javascript Objects,我测试了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 &
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;博士
我只想弄清楚以下说法是否属实:
在一个对象的多个副本中的一个副本中所做的修改可用于该对象的所有副本。如果副本或原件被删除或替换为新对象,则不会影响其他副本 delete所做的就是从对象中删除属性。它实际上对财产的价值没有任何影响 这里的
a
和b
相当于window.a
和window.b
,因为它们是全局对象,而window
是全局对象<因此,code>delete a相当于delete window.a
,它只是从window
对象中删除a
属性
由于JavaScript中的变量不存储对象,而是对对象的引用,delete a
所做的就是删除一个变量,该变量包含对同一对象的引用,而该对象继续被b
引用
因此,您的问题本身是有缺陷的,因为它基于对JavaScript中对象语义的错误理解:
如果副本或原件被删除或替换为新对象,则不会影响其他副本
在这种情况下,不存在“副本”或“原件”。根本没有复制对象。您只需要有一个被多个变量引用的对象。此外,JavaScript中没有明确“删除对象”的概念。删除所做的只是从对象中删除属性。它实际上对财产的价值没有任何影响 这里的
a
和b
相当于window.a
和window.b
,因为它们是全局对象,而window
是全局对象<因此,code>delete a相当于delete window.a
,它只是从window
对象中删除a
属性
由于JavaScript中的变量不存储对象,而是对对象的引用,delete a
所做的就是删除一个变量,该变量包含对同一对象的引用,而该对象继续被b
引用
因此,您的问题本身是有缺陷的,因为它基于对JavaScript中对象语义的错误理解:
如果副本或原件被删除或替换为新对象,则不会影响其他副本
在这种情况下,不存在“副本”或“原件”。根本没有复制对象。您只需要有一个被多个变量引用的对象。此外,JavaScript中没有明确“删除对象”的概念。JavaScript中的对象[几乎]总是通过引用传递。在您的例子中,
a
和b
是相同的对象
delete
运算符不删除对象或变量,而是删除属性。在您的示例中,您在全局范围中定义了a
和b
,因此它们被视为窗口
属性。
这是
delete
按预期工作的唯一原因。JavaScript中的对象[几乎]总是通过引用传递。在您的例子中,a
和b
是相同的对象
delete
运算符不删除对象或变量,而是删除属性。在您的示例中,您在全局范围中定义了a
和b
,因此它们被视为窗口
属性。
这是
delete
按预期工作的唯一原因。这种行为是完全正常的,应该在所有JavaScript环境中使用。让我们一步一步地看一遍
创建新对象并将其存储在a
:
a = new Object()
>> Object {}
b
>> Object {}
使b
引用与b
相同的单个对象:
b = a
>> Object {}
(您似乎认为这是以某种方式“复制”了对象。这是不正确的:到目前为止,仍然只有一个对象,但您可以使用a
和b
引用它。您为一个对象指定了两个不同的变量名。)
修改a
引用的对象(记住这也是b
引用的同一个对象),使其具有boo
属性:
a.boo = "Yiss!"
>> "Yiss!"
确认b
引用的对象(与a
引用的对象相同)已更改:
b
>> Object {boo: "Yiss!"}
使a
引用新对象:
a = new Object()
>> Object {}
b
仍然指第一个对象:
b
>> Object {boo: "Yiss!"}
使a
再次引用原始对象:
a = b
>> Object {boo: "Yiss!"}
从原始对象中删除boo
属性:
delete a.boo
>> true
b
>> Object {}
确认已从b
引用的对象中删除boo
属性(与a
引用的对象相同):
确认已从a
引用的对象中删除boo
属性(与b
引用的对象相同):
从全局命名空间中删除变量名“a
”:
delete a
>> true
变量名“a
”不再存在:
a
>> Uncaught ReferenceError: a is not defined
变量b
仍然引用原始对象:
delete a.boo
>> true
b
>> Object {}
你似乎认为这会破坏价值观。事实并非如此。相反,它从对象中删除属性。由于全局变量是全局对象上的属性,因此也可以删除它们(即这里,
a
与window.a
相同)。这种行为是完全正常的,应该在所有JavaScript环境中使用。让我们一步一步地看一遍
创建新对象并将其存储在a
:
a = new Object()
>> Object {}
b
>> Object {}
使b
引用与b
相同的单个对象:
b = a
>> Object {}
(你似乎这么认为