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

array.length = 0;

这使得数组“显示”为空,可以重用,据我所知,这是一个单一的“操作”——也就是说,常数时间。

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

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

但这有线性复杂度。

我也可以扔掉这个对象并创建一个新的对象:

obj = {};

但是“混杂”创建新对象会导致IE6上的垃圾收集问题。(如下所述)


当前回答

好吧,冒着让事情变得太简单的风险…

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

...用最少的吓人的括号在一行代码中清理对象似乎是相当有效的。所有成员将被真正删除,而不是作为垃圾。

显然,如果你想删除对象本身,你仍然必须为它单独执行delete()。

其他回答

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”}

好吧,冒着让事情变得太简单的风险…

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

...用最少的吓人的括号在一行代码中清理对象似乎是相当有效的。所有成员将被真正删除,而不是作为垃圾。

显然,如果你想删除对象本身,你仍然必须为它单独执行delete()。

我认为,对你的问题的简短回答是否定的(你可以创建一个新对象)。

在本例中,我认为将长度设置为0仍然会将所有元素留给垃圾收集。 您可以将此添加到Object。如果它是你经常使用的东西,就创建原型。是的,它在复杂性上是线性的,但以后任何不进行垃圾收集的东西都会是线性的。 这是最好的解决办法。我知道这和你的问题无关,但是我们需要继续支持IE6多久呢?现在有很多运动要求停止使用它。

如果上面有什么不正确的地方,请随时纠正我。

假设你的对象名称是BASKET,简单地设置BASKET = "";

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

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