我有这个 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;
原文由 Anders Östman 发布,翻译遵循 CC BY-SA 4.0 许可协议
该问题有两种可能的解决方案:
分配一个空对象
垃圾收集器会自动清理内存。这个变体非常快,并且在大多数情况下都可以工作,但是,您需要 谨慎 使用它,因为它可能会将对对象的引用保留在内存中。此警告在下面的 TLDR 部分中进行了描述。
逐一删除属性
这将通过遍历每个非原型属性并将其删除来清理对象。它更安全但更慢。您需要确定在特定情况下使用它是否有意义。
TLDR
上面给出的任何解决方案都将在当前情况下为作者完成工作,以及该问题中提供的任何其他有效解决方案。这主要取决于开发人员希望如何操作已弃用数据的方式。
会话对象可能包含由不同变量链接的数据,将新的空对象设置为
req.session
不会破坏对旧数据的引用,因此旧数据将在仍然需要的地方可用。尽管保留旧数据的正确方法是克隆初始对象,但现实生活中的场景可能有所不同。让我们看看下面的例子:我们仍然可以从
session
变量中获取旧数据,但是req.session
是空的:这里设置一个新对象可以作为深度克隆的一种替代方法。垃圾收集器不会从旧的req.session
对象中删除数据,因为它仍然被session
变量引用。使用以下方法深度清洁物体:
… 将从
req.session
对象中 显式 删除所有值,因为session
变量链接到同一对象,session
也将变为空–。让我们看看它是如何工作的:正如您现在看到的,在这两种情况下我们都得到空对象。
从速度和内存的角度来看,设置一个新的空对象比一个接一个地清理旧对象的属性 _要快得多_,但是如果旧数据仍然在某处引用,那么在内存方面,新对象方法不会释放旧数据所占用的内存消费。
很明显,选择采用的方法主要取决于您的编码方案,但在大多数情况下
req.session = {};
可以完成工作:它又快又短。但是,如果您在其他变量中保留对原始对象的引用,您可以考虑使用深度隐式对象属性删除。