我有这个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;
只需分配一个空对象:
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] 删除。
我来说两句