我无法理解为什么我的变量会改变
if(chat.users[i + 1])
console.log("1: " + chat.users[i + 1].username);
if(save[i+1])
console.log("2: " + save[i + 1].username);
chat.users[i + 1] = save[i];
if(chat.users[i + 1])
console.log("3: " + chat.users[i + 1].username);
if(save[i+1])
console.log("4: " + save[i + 1].username);
我有
1: test1
2: test1
3: test
4: test
我无法理解为什么我没有
1: test1
2: test1
3: test
4: test1
由于
编辑:所有代码都在那里
http://codepaste.net/gi5ghf (第92行)
答案 0 :(得分:1)
现在用你的代码就可以了!我们来看看吧
var chat = {
users: [
{
username: "test"
},
{
username: "test1"
}
]
},
// creating reference from save to chat.users
save = chat.users,
i = 0;
if (chat.users[i + 1]) {
// should be chat.users[1].username ("test1")
console.log("1: " + chat.users[i + 1].username); // output "test1"
}
if (save[i + 1]) {
// should be save[1].username ("test1")
console.log("2: " + save[i + 1].username); // output "test1"
}
/*
* creating reference
* so chat.users[i + 1] is now save[i] ({ username: "test" })
* and because save is reference of chat.users, save[i + 1] is now also now save[i] ({ username: "test" })
*/
chat.users[i + 1] = save[i];
if (chat.users[i + 1]) {
// should be chat.users[1].username ("test")
console.log("3: " + chat.users[i + 1].username); // output "test"
}
if (save[i + 1]) {
// should be chat.users[0].username ("test")
console.log("4: " + save[i].username); // output "test"
}
<强>什么吗
让我再次向你解释一下。例如,你得到了这个:
var a = [1, 2];
现在你写下这个:
var b = a;
也许你想复制a到b,但你只创建了一个参考文献!
所以看看这个:
console.log(a, b);
//=> [1, 2] [1, 2]
a[0] = 3;
console.log(a, b);
//=> [3, 2] [3, 2]
b[0] = 4;
console.log(a, b);
//=> [4, 2] [4, 2]
因此,如果您更改了对象或数组的一个值,那么它也将被更改为另一个值,因为它只是一个引用,并且它们都具有相同的内存地址。
如果您真的想克隆/复制对象/数组,请查看this question。
答案 1 :(得分:0)
save [i]似乎是用户名为'test'的用户。 您将此用户分配给chat.users [i + 1]:
chat.users[i + 1] = save[i];
然后你打印出它的用户名:
if(chat.users[i + 1]) console.log("3: "+chat.users[i + 1].username);
最后,你打印出save [i]的用户名:
if(save[i+1]) console.log("4: "+save[i].username);
打印出'test',因为这就是保存[i]的用户名。
也许你的意思是打印出最后一行保存[i + 1]的用户名,而不是保存[i]的用户名? save [i + 1]的用户名为'test1'。