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

array.length = 0;

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

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

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

但这有线性复杂度。

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

obj = {};

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


当前回答

这困扰了我很久,所以这里是我的版本,因为我不想要一个空对象,我想要一个所有的属性,但重置为一些默认值。有点像类的新实例化。

let object1 = { a: 'somestring', b: 42, c: true, d:{ e:1, f:2, g:true, h:{ i:"hello" } }, j: [1,2,3], k: ["foo", "bar"], l:["foo",1,true], m:[{n:10, o:"food", p:true }, {n:11, o:"foog", p:true }], q:null, r:undefined }; let boolDefault = false; let stringDefault = ""; let numberDefault = 0; console.log(object1); //document.write("<pre>"); //document.write(JSON.stringify(object1)) //document.write("<hr />"); cleanObject(object1); console.log(object1); //document.write(JSON.stringify(object1)); //document.write("</pre>"); function cleanObject(o) { for (let [key, value] of Object.entries(o)) { let propType = typeof(o[key]); //console.log(key, value, propType); switch (propType) { case "number" : o[key] = numberDefault; break; case "string": o[key] = stringDefault; break; case "boolean": o[key] = boolDefault; break; case "undefined": o[key] = undefined; break; default: if(value === null) { continue; } cleanObject(o[key]); break; } } } // EXPECTED OUTPUT // Object { a: "somestring", b: 42, c: true, d: Object { e: 1, f: 2, g: true, h: Object { i: "hello" } }, j: Array [1, 2, 3], k: Array ["foo", "bar"], l: Array ["foo", 1, true], m: Array [Object { n: 10, o: "food", p: true }, Object { n: 11, o: "foog", p: true }], q: null, r: undefined } // Object { a: "", b: 0, c: undefined, d: Object { e: 0, f: 0, g: undefined, h: Object { i: "" } }, j: Array [0, 0, 0], k: Array ["", ""], l: Array ["", 0, undefined], m: Array [Object { n: 0, o: "", p: undefined }, Object { n: 0, o: "", p: undefined }], q: null, r: undefined }

其他回答

简单的方法:

Object.keys(object).forEach(key => {
  delete object[key];
})

对象。键会以数组的形式返回对象的每个键,例如:

const user = {
  name: 'John Doe',
  age: 25,
};

Object.keys(user) // ['name', 'age']

forEach将在每个元素的第一个参数中运行函数,而delete关键字将从对象中删除一个键。 因此,代码将为每个键删除对象的一个键。

有一些新的东西可以让你去思考,去期待。在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号可能是最好的选择。

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

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

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

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

假设你的对象名称是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;
};