使用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是一个更好的选择。

其他回答

有一些新的东西可以让你去思考,去期待。在ES7和一般的数据绑定中观察。考虑:

var foo={
   name: "hello"
};

Object.observe(foo, function(){alert('modified');}); // bind to foo

foo={}; // You are no longer bound to foo but to an orphaned version of it
foo.name="there"; // This change will be missed by Object.observe()

所以在这种情况下,2号可能是最好的选择。

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是一个更好的选择。

你可以试试这个。下面的函数将对象属性的所有值设置为undefined。适用于嵌套对象。

var clearObjectValues = (objToClear) => {
    Object.keys(objToClear).forEach((param) => {
        if ( (objToClear[param]).toString() === "[object Object]" ) {
            clearObjectValues(objToClear[param]);
        } else {
            objToClear[param] = undefined;
        }
    })
    return objToClear;
};

Const obj = { 第二:“hasValue”, 第三:假的, 第一:空, 第四:真 } Const translator = { 空:“-”, 真:“OK”, 错误的:“不” } const cleanObject = Object.fromEntries(Object.entries(obj).map(([key, value]) => [key, translator[value] || value])); console.log (cleanObject);/ /{第二:‘hasValue’,第三:‘没有’,第一:‘-’,第四:“OK”}

可以删除道具,但不能删除变量。删除abc;在ES5中无效(并使用strict抛出)。

您可以将其赋值为null以将其删除到GC(如果您有其他对属性的引用,则不会这样做)

在对象上设置length属性不会改变任何东西。(它只是,嗯,设置属性)