对象的任何方面都是通过引用来破坏赋值的吗
Are any aspects of object destructuring assignments by reference?
我有一个程序,它正在增加会话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
相关文章:
- Javascript/Html 未捕获的引用错误:赋值中的左侧无效;未捕获的引用错误:未定义计算
- 在javascript中构建HTML表,得到“引用错误:左侧无效赋值”
- 在引用错误中将字符串放在一起:左侧的赋值无效
- 未捕获的引用错误:赋值(匿名函数)中的左侧无效
- Array.map+try/catch传递了引用赋值延迟
- 为什么不是't当给这个对象赋值时,它是通过引用传递的
- json数组对象引用赋值让我困惑
- 赋值一个新对象并保持引用
- Javascript对象内容通过引用赋值,这是可能的吗?
- 给闭包内的变量赋值一个对闭包的引用——它会泄漏吗?
- Javascript通过引用和局部变量赋值传递
- JavaScript中的链式赋值和循环引用
- Angular Service——返回私有值vs .引用私有值赋值
- 相当于JavaScript中的引用赋值
- 未捕获引用错误:赋值中的左侧无效(更改css背景色)
- 对象的任何方面都是通过引用来破坏赋值的吗
- 如果第一个条件为true,则在javascript中为变量赋值,引用错误左侧赋值无效
- Javascript 在维护引用时对对象进行变量赋值
- 变量赋值 - Javascript: array1[0] = array2[0];这是按值传递还是按引用传递
- 引用错误:对象赋值中的左侧无效