所以我有一个会话变量req.session.user,它包含一个对应于用户帐户的对象。当我这样做时,如何保持会话变量不变?
var user = req.session.user;
var fakeUser = user;
fakeUser.username = 'bob';
user.username和req.session.user.username都变为'bob'。我如何防止这种情况?
所以我有一个会话变量req.session.user,它包含一个对应于用户帐户的对象。当我这样做时,如何保持会话变量不变?
var user = req.session.user;
var fakeUser = user;
fakeUser.username = 'bob';
user.username和req.session.user.username都变为'bob'。我如何防止这种情况?
克隆它
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;
}
完美工作。谢谢! – user1816679 2013-05-14 17:10:23
当您编写var fakeUser = user
时,将复制对象用户的引用 - fakeUser
仍然引用相同的对象。
如果你想复制的对象,你要复制它或复制用户的唯一期望的特性:如:
var fakeUser = {
name: user.name,
id: user.id
}
JS clonning在以下答案中描述:
您也可以使用下划线库的clone method(但请注意,它只是做一个浅拷贝(不深) - 即如果用户对象包含一些引用,它们被复制作为参考)。
克隆对象的简单方法是只序列化和deserilaze它(但这不会对循环引用的工作 - 当对象引用本身或它的一部分):
function clone(a) {
return JSON.parse(JSON.stringify(a));
}
你的意思是你需要一个“价值副本”而不是“参考副本”? – AliBZ 2013-05-14 00:17:25