for of循环中的Javascript引用

for of循环中的Javascript引用,javascript,ecmascript-6,Javascript,Ecmascript 6,使用常规for循环,我可以执行以下操作: for (let i = 0; i < objects.length; i++) { delete objects[i]; } 这将产生这样的错误 SyntaxError:在严格模式下删除局部变量 这是预期的,o是一个副本。那么,有没有办法初始化o作为参考?例如,在C++11中就是这样做的: for (auto &o : objects) { // o is a reference to an object from ob

使用常规for循环,我可以执行以下操作:

for (let i = 0; i < objects.length; i++) {
    delete objects[i];
}
这将产生这样的错误

SyntaxError:在严格模式下删除局部变量

这是预期的,
o
是一个副本。那么,有没有办法初始化
o
作为参考?例如,在C++11中就是这样做的:

for (auto &o : objects) {
    // o is a reference to an object from objects
}
您可以使用一个方法来实现这一点,该方法向迭代器函数提供数组项以及该项的索引

var-arr=[1,2,3];
arr.forEach(功能(项目、索引){
删除arr[索引];
});

控制台日志(arr)
delete
将永远不会实际删除底层对象-如果对象(或数组)上的属性是对对象的引用,例如使用
对象[i]
,并且从对象中删除属性(可以使用
删除
,例如
删除对象[i]
),则该对象(
对象[i])
)仍将存在于内存中(目前)。只有当其他任何东西都无法引用它并且垃圾收集器运行时,它才会被实际删除

例如,使用以下代码:

const obj = { foo: 'foo' };
const arr = [obj];
您所能做的任何事情
arr
都无法取消引用
obj
指向的对象。(您可以对其进行变异,例如(arr[0]的const prop)删除arr[0][prop]
,但无法从内存中删除对象本身。)

如果数组中的每个对象没有在其他任何地方引用,则使用原始代码取消引用所有对象以便对其进行GC:

for (let i = 0; i < objects.length; i++) {
    delete objects[i];
}
for(设i=0;i

或者类似的东西。

JavaScript不支持应用于对象的
delete
——这是一个语法错误。JavaScript中的delete操作符只适用于从对象中删除命名属性。该属性的类型和值无关紧要

因此

a
中删除名为“0”的属性。存储在数组中的匿名对象在代码中任何地方都没有进一步的引用,将由GC收集

但是

是由错误的
delete
表达式生成的-没有提供要删除的属性名称

这是预期的,o是一个副本

<强> > < /强>仍然暗示C++。JavaScript中的对象数据值是对对象数据结构的引用。它可以是一个内存指针,但这完全取决于JavaScript引擎

该语言不提供访问内部引用/指针值或对其执行任何地址操作的方法。复制的对象值将引用与其复制源的值相同的数据结构


可以对对象的任何引用或复制的引用执行对象特性的操作。同样值得注意的是,JavaScript对象不支持析构函数。当没有可访问的代码仍然可以访问对象时,GC可以回收对象的内存资源

使用带有检查的for in循环?或者只是坚持你的for循环…你确定要
删除
?,而不是
拼接
?请注意:如果性能是您关心的问题之一,则不应以这种方式“初始化”对象<代码>删除
是JS引擎中最糟糕的性能杀手。你应该重构你的代码,这样你就可以用一个新的对象来替换你的对象,或者干脆把值设置为
未定义的
。这很有趣,我想问一下javascript在删除对象时的最佳实践是什么。将对象标记为不再需要以便垃圾收集器可以删除它的最佳方法是什么?按照@DenysSéguret的建议将其设置为未定义?(以及它包含的所有使用new运算符创建的对象)当您停止引用某个值(最常见的原因是当前范围不再使用)时,该值将被丢弃。在JS(或任何现代内存管理语言)中,您不会手动标记要删除的值。
for (let i = 0; i < objects.length; i++) {
    delete objects[i];
}
let a= [{}];
delete a[0];
 let a = [{}];
 for (let o of a) {
    delete o;
 }