Pensez-y de cette façon. a[0]
n'est pas l'objet réel {x : 1}
. Cet objet se trouve quelque part en mémoire et a[0]
contient l'adresse mémoire où cet objet est stocké.
Si vous faites a[0].x
, vous le déréférenciez. Cela signifie que vous analysez la pièce avant le .
et voyez l'adresse. Vous allez alors chercher l'objet à cette adresse et voir s'il a une propriété x
et le renvoyer. Mais si vous faites b=a[0]
, vous copiez simplement l'adresse de l'objet en b. Donc maintenant vous avez deux références (raccourcis vers l'adresse mémoire où l'objet est stocké). Si vous faites maintenant b.x = 5
vous regardez ce qui est avant le .
; c'est b
contenant l'adresse de l'objet, vous récupérez cet objet de la mémoire, vérifiez s'il a la propriété x
et changez sa valeur à 5. Mais a[0]
points à la même adresse (donc sur le même objet) donc si vous essayez de faire a[0].x
Comme avant, vous arrivez à l'adresse que vous venez de modifier.
Il s'agit d'une explication simplifiée, mais vous devez penser aux variables qui contiennent des objets en tant que raccourcis vers l'adresse mémoire où se trouve l'objet réel. Et si vous essayez d'attribuer à une variable la valeur d'une autre variable d'objet, vous venez de créer un nouveau raccourci. Cela n'est pas vrai pour les variables contenant des nombres, donc x contient en réalité la valeur 1
, ou 5
, pas une adresse. Donc, si vous faites:
y = a[0].x;
y = 10;
a[0].x
ne changera pas sa valeur.
Vous devriez jeter un coup d'œil à http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-a-javascript-object pour des suggestions sur la façon de procéder. –