Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Passage des arguments des fonctions par variable

6 réponses
Avatar
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=10;
V=20;
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=10;
V=20;
A=U; B=V; swap (); U=A; V=B

mais c'est lourd.

6 réponses

Avatar
akatronic
Le Fri, 31 Dec 2010 15:27:27 +0100,
"ast" a écrit :

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.


Avatar
Pascal
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
Avatar
Dr J R Stockton
En fr.comp.lang.javascript <4d1de854$0$25121$, 31
Dec 2010 15:27:27, ast a ecrit:

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 <http://www.jibbering.com/faq/index.html&gt;.
<http://www.merlyn.demon.co.uk/js-index.htm&gt; jscr maths, dates, sources.
<http://www.merlyn.demon.co.uk/&gt; TP/BP/Delphi/jscr/&c, FAQ items, links.
Avatar
Pascal
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
Avatar
ast
"Pascal" a écrit dans le message de
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.
Avatar
Pascal
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