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

时间:2016-08-05 20:34:55

标签: javascript node.js session httprequest

我有一个程序正在递增会话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的结果(你可以改变成员变量),或者有一些一种奇怪的错误。我也很难在较小的范围内复制这个例子,但我确认进入或离开该函数的任何东西都不会影响这段代码。

它没有破坏我的代码或任何东西(它实际上让我的生活更轻松)但我想知道为什么会这样!

2 个答案:

答案 0 :(得分:4)

我默认对象解构工作与普通作业基本相同。考虑:

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

答案 1 :(得分:3)

From MDN:

  

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

如果此数据恰好是对象引用,此对象引用将被复制到新变量,或者在您的情况下为常量。

最小例子:



border-bottom




相关问题