Passage des arguments des fonctions par variable

Le
ast
bonjour,

J'apprends avec stupéfaction qu'on ne peut pas passer
par variable des argument de type primitif (nombre, chaine,
boolean) en paramètre des fonctions.

Par exemple si je veux échanger le contenu de 2 variables:

function swap (A, B) {

var I = 0;
I = A;
A = B;
B = I;
}

U;
V ;
swap (U, V);

document.write (U + "<BR>");
document.write (V + "<BR>");

et bien ça ne marche pas.

Incroyable pour un langage "récent". Même le préhistorique C
permet le passage de pointeur.

Evidement on peut travailler sur des variables globales:

var A = 0;
var B = 0;

function swap () {
var I = 0;
I = A;
A = B;
B = I;
}

U;
V ;
A=U; B=V; swap (); U=A; V=B

mais c'est lourd.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
akatronic
Le #22977401
Le Fri, 31 Dec 2010 15:27:27 +0100,
"ast"
bonjour,

J'apprends avec stupéfaction qu'on ne peut pas passer
par variable des argument de type primitif (nombre, chaine,
boolean) en paramètre des fonctions.



le monde est plein de surprises :)

Par exemple si je veux échanger le contenu de 2 variables:

function swap (A, B) {

var I = 0;
I = A;
A = B;
B = I;
}

U;
V ;
swap (U, V);

document.write (U + "<BR>");
document.write (V + "<BR>");

et bien ça ne marche pas.



il faudrait ajouter un return à la fonction.

Incroyable pour un langage "récent". Même le préhistorique C
permet le passage de pointeur.

Evidement on peut travailler sur des variables globales:

var A = 0;
var B = 0;

function swap () {
var I = 0;
I = A;
A = B;
B = I;
}

U;
V ;
A=U; B=V; swap (); U=A; V=B

mais c'est lourd.


Pascal
Le #22978111
Le 31/12/2010 15:27, ast a écrit :
bonjour,



Bonjour,

J'apprends avec stupéfaction qu'on ne peut pas passer
par variable des argument de type primitif (nombre, chaine,
boolean) en paramètre des fonctions.



Je ne connaissais pas l'expression "passer par variable", mais je pense
que tu parles du passage par référence. Dans ce cas, c'est vrai que JS
ne prévoit pas de mécanisme tout prêt pour cela.

Evidemment on peut travailler sur des variables globales:



Oui mais, pour cela, il faut utiliser les propriétés de l'objet global
("this" en général, ou "window" dans un client web).

Par exemple :

<script>
function swapGlobalVars(varName_1, varName_2) {
var temp = this[varName_1];
this[varName_1] = window[varName_2];
this[varName_2] = temp;
}
var a = 2, b = 3;
console.log(a, b); // 2 3
swapGlobalVars("a", "b");
console.log(a, b); // 3 2
</script>


--
Cordialement,
Pascal
Dr J R Stockton
Le #22979111
En fr.comp.lang.javascript Dec 2010 15:27:27, ast
J'apprends avec stupéfaction qu'on ne peut pas passer
par variable des argument de type primitif (nombre, chaine,
boolean) en paramètre des fonctions.

Par exemple si je veux échanger le contenu de 2 variables:

function swap (A, B) {

var I = 0;
I = A;
A = B;
B = I;
}

U;
V ;
swap (U, V);

document.write (U + "<BR>");
document.write (V + "<BR>");

et bien ça ne marche pas.



Ceci marche :

function swap (Z) {
var I = 0;
I = Z.U;
Z.U = Z.V;
Z.V = I;
}

G = {};
G.U = 10;
G.V = 20;
swap (G);

x = [G.U, G.V]

Me servant d'un mot de Panoramix : helas, mon Francais est epovantable.

--
(c) John Stockton, nr London UK. ?@merlyn.demon.co.uk IE8 FF3 Op10 Sf5 Cr7
news:comp.lang.javascript FAQ
Pascal
Le #22979061
Le 01/01/2011 19:09, Pascal a écrit :
Oui mais, pour cela, il faut utiliser les propriétés de l'objet global
("this" en général, ou "window" dans un client web).



Le truc gênant, dans ma réponse, était de ne pouvoir utiliser que des
variables globales.

J'ai trouvé un moyen, certes un peu tordu, de changer par référence des
valeurs primitives quelque soit le contexte.
L'idée est d'encapsuler ces valeurs dans des objets de transit, et
d'utiliser une méthode prototypée sur le constructeur Object.

Je me suis inspiré de ce billet :
http://sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html

<script>
Object.prototype.changeByRef = function(value) {
this.valueOf = function() { return value };
}
function swapVars(var_1, var_2) {
var temp = var_1.valueOf();
var_1.changeByRef(var_2.valueOf());
var_2.changeByRef(temp);
}
function test() {
var c = 4, d = 5;
console.log(d - c); // 1
c = Object(c);
d = Object(d);
swapVars(c, d)
console.log(c - d); // 1 également
}
test();
</script>

--
Cordialement,
Pascal
ast
Le #22984981
"Pascal" news:ifnql4$b6b$

var a = 2, b = 3;
console.log(a, b); // 2 3
swapGlobalVars("a", "b");
console.log(a, b); // 3 2



console.log n'a pas l'air de fonctionner chez moi.
j'utilise IE8
Apparemment if faudrait d'abord activer la console mais
je n'ai pas trouvé comment.
Pascal
Le #22985201
Le 04/01/2011 10:41, ast a écrit :
console.log n'a pas l'air de fonctionner chez moi.
j'utilise IE8



Ah oui, c'est l'habitude d'utiliser Firebug en extension de Firefox, désolé.
Il y a aussi une extension gratuite pour IE qui offre la même
fonctionnalité. Je crois me souvenir qu'elle s'appelle "Companion JS".

Sinon, remplacer mes "console.log()" par les classiques "alert()" ou
"document.write()".

--
Cordialement,
Pascal
Publicité
Poster une réponse
Anonyme