Est-il possible de passer par valeur par référence en JavaScript?

Lorsque j'ai commencé à apprendre à fonctionner en C ++, tout passe par valeur et par référence. Existe-t-il quelque chose de semblable dans javascript?

Si oui / pas comment fonctionne-t-il en cas de javascript?

Merci a tous.

Le JavaScript est toujours passé en valeur, ne passe jamais par référence. Beaucoup de gens confondent ceci en raison de la façon dont les objets fonctionnent.

Il n'y a pas de "passer par référence" pour n'importe quelle variable en JavaScript (non, même si un objet est affecté à cette variable). Toutes les variables et les arguments sont attribués par valeur. Si la valeur assignée est un objet, la valeur de la nouvelle variable est une référence à cet objet, mais l'attribution d'une nouvelle valeur / objet à la nouvelle variable n'aura aucune incidence sur la variable d'origine.

Certaines personnes qualifient ce comportement de «valeur par référence» .

Une comparaison – PHP

$foo = "foo"; $bar = &$foo; // assign by reference $bar = "bar"; echo $foo; // -> output: "bar" 

JavaScript

 foo = {"foo": true}; bar = foo; // assign value by reference bar = {"bar": true}; alert(JSON.stringify(foo)); // -> output: '{"foo": true} 

D'autres réponses à cette question sont correctes: toutes les variables sont passées en valeur par JavaScript, et parfois cette valeur pointe vers un objet.

Lorsqu'un langage de programmation prend en charge le passage par référence, il est possible de changer l' emplacement de la variable à partir d'une fonction. Ceci n'est jamais possible en JavaScript.

Par exemple, considérez ce code qui tente de réaffecter la variable passée à une nouvelle valeur:

 function changeCaller( x ) { x = "bar"; // Ha ha! } function testChangeCaller() { var x = "foo"; changeCaller(x); alert(x); // still "foo" } testChangeCaller(); 

Les tentatives de pointage de variables sur de nouveaux objets échouent de la même manière que l'exemple ci-dessus ne parvient pas à réaffecter une chaîne primitive:

 function changeCaller( x ) { x = new Object(); // no longer pointing to the same object xa = "bar"; } function testChangeCaller() { var x = new Object(); xa = "foo"; changeCaller(x); alert(xa); // still "foo" } testChangeCaller(); 

La fonctionnalité qui permet aux gens de croire qu'ils traitent d'un scénario de passage par référence est lors de la modification d'objets. Vous pouvez apporter des modifications à un objet ou un tableau, car la variable locale pointe vers le même objet :

 function changeCaller( x ) { xa = "bar"; } function testChangeCaller() { var x = new Object(); xa = "foo"; changeCaller(x); alert(xa); // now "bar", since changeCaller worked on the same object } testChangeCaller(); 

J'espère que cela t'aides!

En ce qui concerne la discussion, les considérations relatives à la «valeur» et à la «référence» sont erronées à l'exception du commentaire Pointy. Javascript ressemble à d'autres arguments de référence comme c # ou java, ne transmet pas un référent à la variable elle-même à la méthode, mais la référence de l'objet référencé par la variable. Ce que les gens attendent ici, passe un pointeur vers la variable qui fait référence à l'objet, passe par un pointeur n'est pas le même que passer par référence et n'est pas le même que passer par valeur.

Le comportement attendu ici est passé par le pointeur. Passer par référence envoie la référence à l'objet. Passer par valeur, copier l'objet stocké dans la variable et passer la copie à la méthode.

La passe par valeur, passée par discussion de référence est un meme maléfique. Ce meme malin se développe aussi dans les discussions Java.

C'est simple: le motif de bits de la valeur est copié dans le paramètre. Peu importe si le bit pattern est un int ou si c'est l'adresse d'un objet – il est simplement copié, peu à peu, dans le paramètre. Il ne pouvait pas être plus simple. Le temps d'exécution ne fait pas quelque chose de spécial pour les primitives par rapport aux références. C'est tout simplement, et toujours, juste une copie de la valeur.

Le terme informatique pour cela est «passer par valeur».

Passer par référence n'est plus utilisé dans la programmation. Dans les langues plus anciennes, comme Pascal, vous pouvez coder une fonction pour modifier directement la valeur dans la routine d'appel. Ainsi, par exemple, une variable int dans la routine d'appel pourrait être modifiée dans la fonction appelée.

Les valeurs primitives sont transmises via la valeur et les objets sont transmis par référence.

Les cordes sont immuables, donc elles sont transmises par référence même si elles sont considérées comme des types primitifs.