所以我有一个会话变量 req.session.user,它包含一个对应于用户帐户的对象。当我这样做时,
var user = req.session.user;
var fakeUser = user;
fakeUser.username = 'bob';
user.username 和 req.session.user.username 也都更改为“bob”。我该如何防止这种情况?
当您编写时,var fakeUser = user
您复制对对象用户的引用 -fakeUser
仍然引用同一个对象。
如果要复制对象,则必须克隆它或仅复制用户所需的属性:例如:
var fakeUser = {
name: user.name,
id: user.id
}
JS 克隆在以下答案中进行了描述:
您还可以使用下划线库的克隆方法(但请注意,它只是进行浅拷贝(而不是深拷贝) - 即,如果用户对象包含一些引用,它们将被复制为引用)。
克隆对象的简单方法是对其进行序列化和反序列化(但这不适用于循环引用 - 当对象引用自身或其一部分时):
function clone(a) {
return JSON.parse(JSON.stringify(a));
}
克隆它
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;
}