使用JavaScript数组,我可以用一个赋值将其重置为空状态:
array.length = 0;
这使得数组“显示”为空,可以重用,据我所知,这是一个单一的“操作”——也就是说,常数时间。
有没有类似的方法来清除JS对象?我知道我可以迭代它的字段删除它们:
for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }
但这有线性复杂度。
我也可以扔掉这个对象并创建一个新的对象:
obj = {};
但是“混杂”创建新对象会导致IE6上的垃圾收集问题。(如下所述)
ES5
ES5解决方案可以是:
// for enumerable and non-enumerable properties
Object.getOwnPropertyNames(obj).forEach(function (prop) {
delete obj[prop];
});
ES6
而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];
}
for. in应该只在浅对象或普通对象上执行的原因是,它遍历原型继承的属性,而不仅仅是自己的可以删除的属性。如果不确定对象是普通的且属性是可枚举的,则使用object。getOwnPropertyNames是一个更好的选择。