JavaScript 删除对象时的奇怪行为
JavaScript weird behavior when object deleted
我做了以下事情:
a = {a:1};
b = {b:1};
c = [a,b]
delete a;
现在我不明白为什么c还有两个对象:[a, b]
但是当我尝试 print a 时,控制台给我:
未捕获的引用错误:a 未定义
对象似乎不存在了,但它仍然存在于数组中。
我也试过打印:
typeof a //"undefined"
typeof c[0] //"object"
我确信当将一个对象分配给一个变量时,它是通过引用分配的。好像这里的对象被复制了?
Unlike what common belief suggests, the delete operator has nothing to
do with directly freeing memory. Memory management is done indirectly
via breaking references, see the memory management page for more
details.
阅读here
即使在您删除 a
之后,a
的引用仍将存储在 c
.
中
因此 c
将始终是 object
类型。
a = {a:1};
b = {b:1};
c = [a,b];
delete a;
console.log(c);
以上代码将return:
[
{
"a": 1
},
{
"b": 1
}
]
但是如果你删除 delete c[0].a
那么它会从数组 c
中删除 a
:
a = {a:1};
b = {b:1};
c = [a,b];
console.log (delete c[0].a);
console.log(c);
输出将是:
[
{},
{
"b": 1
}
]
delete
运算符从对象中删除 属性。
也就是说,如果你有一个对象const obj = { a: 56, b: 62 }
并且你执行delete obj.b
,b
属性将被删除并且对象只会是{ a: 56 }
.
由于您没有声明任何变量,因此您正在隐式处理 window 对象。您的代码相当于:
window.a = {a:1};
window.b = {b:1};
window.c = [window.a, window.b]
delete window.a;
如您所见,您刚刚向 window
对象添加了一些属性,然后删除了其中一个。但是,您没有删除分配给 属性 的对象。
JavaScript 中的任何对象都将被保留,直到不再引用每个对象为止。在这里,分配给 window.c
的数组中仍然清楚地引用了您希望删除的对象,并且该对象没有被销毁。 (想一想:如果删除了对象,您希望数组中包含什么?)
我做了以下事情:
a = {a:1};
b = {b:1};
c = [a,b]
delete a;
现在我不明白为什么c还有两个对象:[a, b] 但是当我尝试 print a 时,控制台给我: 未捕获的引用错误:a 未定义
对象似乎不存在了,但它仍然存在于数组中。
我也试过打印:
typeof a //"undefined"
typeof c[0] //"object"
我确信当将一个对象分配给一个变量时,它是通过引用分配的。好像这里的对象被复制了?
Unlike what common belief suggests, the delete operator has nothing to do with directly freeing memory. Memory management is done indirectly via breaking references, see the memory management page for more details.
阅读here
即使在您删除 a
之后,a
的引用仍将存储在 c
.
因此 c
将始终是 object
类型。
a = {a:1};
b = {b:1};
c = [a,b];
delete a;
console.log(c);
以上代码将return:
[
{
"a": 1
},
{
"b": 1
}
]
但是如果你删除 delete c[0].a
那么它会从数组 c
中删除 a
:
a = {a:1};
b = {b:1};
c = [a,b];
console.log (delete c[0].a);
console.log(c);
输出将是:
[
{},
{
"b": 1
}
]
delete
运算符从对象中删除 属性。
也就是说,如果你有一个对象const obj = { a: 56, b: 62 }
并且你执行delete obj.b
,b
属性将被删除并且对象只会是{ a: 56 }
.
由于您没有声明任何变量,因此您正在隐式处理 window 对象。您的代码相当于:
window.a = {a:1};
window.b = {b:1};
window.c = [window.a, window.b]
delete window.a;
如您所见,您刚刚向 window
对象添加了一些属性,然后删除了其中一个。但是,您没有删除分配给 属性 的对象。
JavaScript 中的任何对象都将被保留,直到不再引用每个对象为止。在这里,分配给 window.c
的数组中仍然清楚地引用了您希望删除的对象,并且该对象没有被销毁。 (想一想:如果删除了对象,您希望数组中包含什么?)