该问题有两种可能的解决方案:
分配一个空对象
req.session = {};
垃圾收集器会自动清理内存。此变体速度非常快,并且在大多数情况下都可以使用,但是,您需要谨慎使用它,因为它可能会将对对象的引用保留在内存中。此警告在下面的TLDR部分中进行了描述。
一个一个地删除属性
Object.keys(object).forEach(key => delete object[key]);
这将通过检查每个非原型属性并删除它来清理对象。它更安全但更慢。您需要确定在特定情况下使用它是否有意义。
TLDR
上面给出的任何解决方案都将在当前情况下为作者完成工作,以及此问题中提供的任何其他有效解决方案。这主要取决于开发人员希望如何操作已弃用的数据。
会话对象可能包含由不同变量链接的数据,并且设置一个新的空对象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
变量引用。
使用以下方法对物体进行深度清洁:
Object.keys(object).forEach(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(key => delete req.session[key]);
console.log( req.session, session ); // {}, {}
正如您现在所看到的,在这两种情况下,我们都会得到空对象。
从速度和内存的角度来看,设置一个新的空对象将比按属性清理旧对象属性快得多,但是如果旧数据仍然在某处引用,则新对象方法不会释放旧数据所在的内存消耗。
很明显,选择要采用的方法主要取决于您的编码方案,但在大多数情况下req.session = {};
可以完成工作:它既快又短。但是,如果您在其他变量中保留对原始对象的引用,则可以考虑使用深层隐式对象属性删除。