对象解构的任何方面是通过引用分配的吗?

我有一个程序是递增会话cookie上的请求,并将其打印到控制台。 最初,我试图弄清楚如何保存这些数据。 login几个地方后,我意识到,尽pipe我有一个单独的variables来保存我认为是req成员对象的临时版本的数据正在保存/更改。

这是使我意识到实际的对象正在改变时,我增加了我分配给它的variables的代码:

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的文档中find这是否是有意的行为,不pipe这是否是我使用const的结果(在这里你可以改变成员variables),或者有一些奇怪的错误正在进行。 我也有麻烦重现这个例子在一个较小的规模,但我证实没有进入或走出function正在影响这一块代码。

这不是打破我的代码或任何东西(这实际上使我的生活更容易),但我想明白为什么发生这种情况!

我会默认的对象解构结构基本上与正常的赋值相同。 考虑:

 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); 

来自MDN:

解构赋值语法是一个JavaScriptexpression式,可以将数组或对象中的数据提取到不同的variables中。

如果这个数据碰巧是一个对象引用,那么这个对象引用将被复制到新的variables中 ,或者在你的情况下是常量。

最小的例子:

 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