将对象重置为空对象,在非线性时间内保持引用完整

Wex*_*Wex 4 javascript

假设我obj1只有可枚举的属性:

var obj1 = { a: 1, b: 2, c: 3 };
Run Code Online (Sandbox Code Playgroud)

然后我创建obj2一个包含对以下内容的引用obj1

var obj2 = obj1;
obj1 === obj2; // true
Run Code Online (Sandbox Code Playgroud)

在某些时候,我想重置obj1为空对象:

for (key in obj1) {
  delete obj1[key];
}
obj1 === obj2; // true
Run Code Online (Sandbox Code Playgroud)

但我想避免迭代所有属性:

obj1 = {};
obj1 === obj2; // false (this obviously doesn't work)
Run Code Online (Sandbox Code Playgroud)

还有其他解决方案吗?

jca*_*ron 5

如果您对数据模型有灵活性,则将实际属性存储在子对象中:

var obj1 = {theData: { a: 1, b: 2, c: 3} };
Run Code Online (Sandbox Code Playgroud)

然后您可以使用 重置属性obj1.theData = {}

当然,这意味着对任何属性的访问都会产生额外的“跳跃”,因此根据您访问数据(读取或写入)与重置对象的频率,您可能最好保留delete

除此之外,我不相信您可以像重置数组一样重置对象(通过a.length=0)。

  • 请注意,将数组的长度设置为零只会删除数字属性,而不会删除其他属性。;-) (3认同)