所以我有一個會話變量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