从对象删除所有属性

安德斯·奥斯曼(AndersÖstman):

我有这个Javascript对象。

req.session

在我的代码中,我向该对象添加了属性。这些属性可以是其他对象,数组,也可以是纯字符串。

req.session.savedDoc = someObject; 
req.session.errors = ['someThing', 'anotherThing', 'thirdThing'];
req.session.message = 'someString'

如果以后我要擦除此对象的所有添加属性,最简单/最佳方法是什么?

一定有比这更好的方法了吗?

// Delete all session values
delete req.session.savedDoc;
delete req.session.errors;
delete req.session.message;
VisioN:

只需分配一个空对象:

req.session = {};

...,垃圾收集器将自动完成其余的工作。


更新:由于这个答案是有争议的,我想在这一点上提供更多的细节。

上面给出的解决方案将为作者在当前情况下工作,以及此问题中提供的任何其他有效解决方案。这主要取决于开发人员如何处理不推荐使用的数据的方式。

会话对象可能包含由不同变量链接的数据,并且将新的空对象设置为req.session不会破坏对旧数据的引用,因此在仍然需要的地方可以使用旧数据。尽管保留旧数据的正确方法是克隆初始对象,但实际情况可能有所不同。让我们看下面的例子:

req.session.user = { name: 'Alexander' };  // we store an object in the session
var session = req.session;                 // save reference to the session in a variable
console.log( req.session, session );       // {user: Object}, {user: Object}

req.session = {};                          // let's replace session with a new object
console.log( req.session, session );       // {}, {user: Object}

我们仍然可以从session变量中获取旧数据,但是它req.session是空的:在这里设置一个新对象可以替代深度克隆。垃圾收集器不会从旧req.session对象中删除数据,因为它仍然被session变量引用

使用@Dave提供的方法或更短的过孔深度清洗对象Object.keys(忽略原型链中的属性,并且对node.js不需要任何填充):

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

...将显式删除req.session对象中的所有值,并且由于session变量链接到同一对象,因此session也将为空。让我们看看它是如何工作的:

req.session.user = { name: 'Alexander' };  // we store an object in the session
var session = req.session;                 // save reference to the session in a variable
console.log( req.session, session );       // {user: Object}, {user: Object}

Object.keys(req.session).forEach(function(key) { delete req.session[key]; });
console.log( req.session, session );       // {}, {}

如您现在所见,在两种情况下,我们都会得到空对象。

从速度和内存的角度来看,设置新的空对象要比按属性清除旧对象的属性要快得多,但是从内存角度来说,如果仍然在某处引用了旧数据,则新对象方法不会释放旧数据正在消耗的内存。

很明显,选择采用的方法主要取决于您的编码方案,但是在大多数情况下,req.session = {};它可以胜任:这既快捷又简短。但是,如果在其他变量中保留对原始对象的引用,则可以考虑使用深层隐式对象属性删除。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章