我在节点应用程序中遇到了一些奇怪的问题。 如果我获取一个变量的内容并分配给另一个变量,它会以某种方式创建它们之间的链接,如果我更改第二个变量中的内容,它也会影响我从中获取内容的第一个变量。
这是我的服务器结构:
var body = {};
现在让我们填充正文:
body[_session] = {
content: { /* some data here */ },
sockets: []
};
然后在某些时候我这样做:
body[new_session] = {
content: body[_session].content,
sockets: []
};
此时,对new_session
内容所做的更改也将在原始_session
内容上进行。
我通过这样做解决了这个问题:
body[new_session] = {
content: JSON.parse(JSON.stringify(body[_session].content)),
sockets: []
};
但它似乎是昂贵的操作和可以避免的东西,我只是不知道如何,也许有人有一个想法,为什么它的发生以及如何解决它而不需要太多的努力。
答案 0 :(得分:1)
这只是创建了一个引用,您需要将body[_session].content
的属性正确复制到新对象。
如果您正在使用ES6,请尝试Object.assign
:
content: Object.assign({}, body[_session].content)
正如你在这里看到的那样:https://jsperf.com/object-assign-vs-iife - 它比stringify / parse方法快3.5倍,同时更具可读性。我已经包含了Mevia的解决方案,以表明它更快,但更冗长,更难以添加到现有的,结构良好的代码库。
否则,请从此处提出解决方案:How do I correctly clone a JavaScript object?