2011-12-09 7 views
3

Je suis un peu confus au sujet de la transmission des variables JavaScript par référence.Passer les variables JavaScript par référence

Prenez le morceau de code suivant:

var p = [1,2]; 
var pRef = p; 
p.push(3); 
pRef === p; // true 

Considérons alors le morceau de code suivant:

var s = "ab"; 
var sRef = s; 
s = s + "c"; 
sRef === s; // false 

ce qui est le truc au sujet de passer les variables par référence JavaScript?

Existe-t-il un moyen de créer une référence à une chaîne?

Répondre

4

La manipulation de la chaîne entraîne la création d'une nouvelle instance d'un objet chaîne. Le fait de pousser des éléments dans un tableau ne crée pas une nouvelle instance du tableau mais y ajoute seulement un élément.

+2

"La manipulation de la chaîne entraîne la création d'une nouvelle instance d'un objet chaîne." Et affecter la nouvelle instance à la variable fait pointer vers ce nouvel objet. – Thilo

0

Les chaînes sont immutables en javascript.

2

Les deux exemples ne font pas la même chose. Dans le premier cas, vous ne réattribuez jamais p, vous appelez simplement des méthodes pour modifier les valeurs dans le tableau. Dans le second cas, vous avez réaffecté s après avoir défini sRef afin qu'ils ne soient plus équivalents.

0

p ne représente pas [1,2] mais un pointeur d'où [1,2] est enregistré en mémoire. Donc si vous changez p, ou pRef, l'endroit où ce tableau est enregistré en mémoire ne changera pas seulement sa valeur sera.

+0

La même chose peut être dite à propos de la variable String, cependant. – Thilo

0

Les objets sont transmis par référence. Si vous voulez une fonction pour manipuler une chaîne par référence, vous pouvez passer cette chaîne sur un objet

function manipulate(obj) { 
    obj.bar += ' changed'; 
} 

var foo = { 
    bar: 'that'; 
}; 

manipulate(foo); 

//foo.bar is now 'that changed' 

Donc, tous les objets sont passés par référence. Les tableaux sont des objets dans js.

Questions connexes