通过引用进行对象解构赋值有哪些方面?

问题描述 投票:0回答:3

我有一个程序,可以增加会话 cookie 上的请求并将其打印到控制台。最初,我试图弄清楚如何保存这些数据。登录几个地方后,我意识到数据正在保存/更改,尽管我有一个单独的变量来保存我认为的 req 成员对象的临时版本。 这段代码让我意识到,当我增加分配给它的变量时,实际对象正在发生变化:

recordRequest(req) { const { ip } = req.info; const { requestsPerSecond } = req.session; if (req.originalUrl.split('/').filter(Boolean)[0] == 'www.example.com') { requestsPerSecond[ip] = requestsPerSecond[ip] + 1 || 1; } console.log(req.session.requestsPerSecond); }

我似乎无法在此处或 Mozilla 的文档中找到这是否是预期行为,这是否是我使用 const (可以改变成员变量)的结果,或者是否存在某种奇怪的错误正在发生。我在以较小的规模重现此示例时也遇到了麻烦,但我验证了函数中的任何进出都不会影响这部分代码。

它并没有破坏我的代码或任何东西(它实际上让我的生活更轻松),但我想了解为什么会发生这种情况!

我默认对象解构的工作原理与正常分配基本相同。考虑:
javascript node.js session httprequest
3个回答
5
投票
const req = {session: {requestsPerSecond: {"0.0.0.0": "foo"}}}; const requestsPerSecond = req.session.requestsPerSecond; // updates to `requestsPerSecond` will also update `req`.

我不确定你可以使用解构来破坏分配,所以你必须使用正常的策略:

const requestsPerSecond = Object.assign({}, req.session.requestsPerSecond);


5
投票

解构赋值语法是一种 JavaScript 表达式,可以将数组或对象中的数据提取到不同的变量中。

如果此数据恰好是一个对象引用,

此对象引用将被复制到新变量中
,或者在您的情况下是常量。

最小示例:

const orig = { foo: { bar: 1 } } const { foo } = orig; console.log(foo.bar); // 1 console.log(orig.foo.bar); // 1 foo.bar++; console.log(foo.bar); // 2 console.log(orig.foo.bar); // 2

您可以使用扩展运算符进行破坏:

0
投票
recordRequest(req) { const { ip } = req.info; const { requestsPerSecond: { ...requestsPerSecond } } = req.session; if (req.originalUrl.split('/').filter(Boolean)[0] == 'www.example.com') { requestsPerSecond[ip] = requestsPerSecond[ip] + 1 || 1; } console.log(req.session.requestsPerSecond); }


© www.soinside.com 2019 - 2024. All rights reserved.