如何快速清除 JavaScript 对象?夏令时断续器性能

2022-08-30 01:15:04

使用JavaScript数组,我可以通过单个赋值将其重置为空状态:

array.length = 0;

这使得数组“看起来”是空的,准备重用,据我所知是一个单一的“操作” - 即恒定时间。

有没有类似的方法来清除JS对象?我知道我可以迭代它的字段删除它们:

for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }

但这具有线性复杂性。

我也可以把对象扔掉,然后创建一个新的:

obj = {};

但是,“混杂”创建新对象会导致IE6上的垃圾回收出现问题。(如此处所述)


答案 1

好吧,冒着让事情变得太容易的风险...

for (var member in myObject) delete myObject[member];

...在一行代码中清理对象似乎非常有效,并且带有最少的可怕括号。所有成员都将被真正删除,而不是作为垃圾留下。

显然,如果你想删除对象本身,你仍然需要为此做一个单独的delete()。


答案 2

夏令时

ES5解决方案可以是:

// for enumerable and non-enumerable properties
Object.getOwnPropertyNames(obj).forEach(function (prop) {
  delete obj[prop];
});

断续器

ES6解决方案可以是:

// for enumerable and non-enumerable properties
for (const prop of Object.getOwnPropertyNames(obj)) {
  delete obj[prop];
}

性能

无论规格如何,最快的解决方案通常是:

// for enumerable and non-enumerable of an object with proto chain
var props = Object.getOwnPropertyNames(obj);
for (var i = 0; i < props.length; i++) {
  delete obj[props[i]];
}

// for enumerable properties of shallow/plain object
for (var key in obj) {
  // this check can be safely omitted in modern JS engines
  // if (obj.hasOwnProperty(key))
    delete obj[key];
}

应仅在浅层或普通对象上执行的原因是,它遍历原型继承的属性,而不仅仅是可以删除的自己的属性。如果不确定某个对象是普通的,并且属性是可枚举的,则 with 是更好的选择。for..inforObject.getOwnPropertyNames