数组variables修改node.js

我不明白为什么我的variables改变

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行)

现在你的代码很清楚! 让我们来看看它

 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; 

也许你想复制一个B,但你只是创build一个参考!

所以看看这个:

 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] 

所以如果你改变一个对象或数组的值,它也会被改变,因为它只是一个引用,而且它们都有相同的内存地址。

如果你真的想克隆/复制对象/数组,然后看看这个问题 。

保存[我]似乎是一个用户名为“testing”的用户。 您正在将此用户分配给chat.users [i + 1]:

 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].username); 

它打印出'testing',因为这是保存[我]的用户名是。

也许你的意思是最后一行打印出保存[i + 1]的用户名,而不是保存[i]的用户名? 保存[i + 1]的用户名是'test1'。