2012-12-10 3 views
1

je ne comprends pas pourquoi mon changement de variabletableau modification variables node.js

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

J'ai

1: test1 
2: test1 
3: test 
4: test 

Je ne comprends pas pourquoi je n'ai pas

1: test1 
2: test1 
3: test 
4: test1 

Merci

Editer: Tout le code est t ici

http://codepaste.net/gi5ghf (ligne 92)

+0

Ok, je le fais et que ŒUVRES \t \t \t \t \t si (temp [0]) Temp [1] = temp [0]; \t \t \t \t \t else temp [1] = enregistrer [i]; \t \t \t \t \t \t si (enregistrer [i + 1]) temp [0] = enregistrer [i + 1]; \t \t \t \t \t chat.users [i + 1] = temp [1]; – Ajouve

Répondre

1

Maintenant, avec votre code, c'est clair! Jetons un coup d'oeil

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" 
} 

Quoi?

Laissez-moi vous l'expliquer à nouveau. Par exemple, vous avez ceci:

var a = [1, 2]; 

Maintenant, vous écrivez ceci:

var b = a; 

Peut-être que vous vouliez copier un à b mais vous seulement créé une référence!

donc un coup d'oeil à ceci:

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] 

Donc, si vous changez une valeur de l'objet ou un tableau, il va être changé pour l'autre aussi parce qu'il est seulement une référence et ils ont tous deux obtenu le même adresse mémoire

Si vous voulez vraiment cloner/copier l'objet/tableau, jetez un oeil à this question.

+0

Désolé, je me trompe copier mon code, I Dans mon code là où je + 1 partout – Ajouve

+0

Maintenant avec votre code, c'est clair. – noob

+0

Ok, merci beaucoup j'ai compris, je dois copier et ne pas créer une référence, merci pour votre lien je vais jeter un oeil – Ajouve

0

sauver [i] semble être un utilisateur avec un nom d'utilisateur 'test'. Vous assignez cet utilisateur à chat.users [i + 1]:

chat.users[i + 1] = save[i]; 

Vous êtes alors l'impression de son nom d'utilisateur il:

if(chat.users[i + 1]) console.log("3: "+chat.users[i + 1].username); 

Enfin, vous imprimez sur Enregistrer [i] » s Nom d'utilisateur:

if(save[i+1]) console.log("4: "+save[i].username); 

Il imprime 'test', parce que ce nom d'utilisateur de sauvegarde de [i] est.

Peut-être que vous vouliez dire que la dernière ligne pour imprimer le nom d'utilisateur de [i + 1], ne pas enregistrer le nom d'utilisateur de [i]? save [i + 1] a un nom d'utilisateur de 'test1'.

+0

Désolé, je me trompe copier mon code, I Dans mon code là où je + 1 partout – Ajouve