对象的任何方面都是通过引用来破坏赋值的吗

Are any aspects of object destructuring assignments by reference?

本文关键字:引用 赋值 任何方 何方 对象      更新时间:2023-09-26

我有一个程序,它正在增加会话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(可以对成员变量进行变异(的结果,或者是否存在某种奇怪的错误。我也很难在较小的范围内复制这个示例,但我验证了函数的任何出入都不会影响这段代码。

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

默认情况下,对象析构函数的工作方式与正常赋值基本相同。考虑:

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:

析构函数赋值语法是一个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