1

所以我有一个会话变量 req.session.user,它包含一个对应于用户帐户的对象。当我这样做时,

var user = req.session.user;
var fakeUser = user;
fakeUser.username = 'bob';

user.username 和 req.session.user.username 也都更改为“bob”。我该如何防止这种情况?

4

2 回答 2

0

当您编写时,var fakeUser = user您复制对对象用户的引用 -fakeUser仍然引用同一个对象。

如果要复制对象,则必须克隆它或仅复制用户所需的属性:例如:

var fakeUser = {
  name: user.name,
  id: user.id
}

JS 克隆在以下答案中进行了描述:

回答 1 回答 2

您还可以使用下划线库的克隆方法(但请注意,它只是进行浅拷贝(而不是深拷贝) - 即,如果用户对象包含一些引用,它们将被复制为引用)。

克隆对象的简单方法是对其进行序列化和反序列化(但这不适用于循环引用 - 当对象引用自身或其一部分时):

function clone(a) {
   return JSON.parse(JSON.stringify(a));
}
于 2013-05-14T00:16:48.320 回答
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;
}
于 2013-05-14T00:18:41.163 回答