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.
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
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>
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
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.
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.
<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
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>
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.
"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.
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
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()".
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()".