所以我有一个会话变量req.session.user,它包含一个与用户帐户对应的对象。当我这样做时,
var user = req.session.user;
var fakeUser = user;
fakeUser.username = 'bob';
user.username和req.session.user.username也都变为'bob'。我该如何防止这种情况?
答案 0 :(得分:0)
当您编写var fakeUser = user
时,您复制对对象用户的引用 - fakeUser
仍然引用同一对象。
如果要复制对象,则必须克隆它或仅复制用户所需的属性:例如:
var fakeUser = {
name: user.name,
id: user.id
}
JS clonning在以下答案中描述:
你也可以使用clone method下划线库(但要注意它只是一个浅的副本(不深) - 即如果用户对象包含一些引用,它们将被复制为引用)。
克隆对象的简单方法是对其进行序列化和反序列化(但这不适用于循环引用 - 当对象引用自身或它的部分时):
function clone(a) {
return JSON.parse(JSON.stringify(a));
}
答案 1 :(得分:0)
克隆它
function clone(obj) {
if (null == obj || "object" != typeof obj) return obj;
var copy = obj.constructor();
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
}
return copy;
}