J'ai ces deux variables:
var a = 1,
b = 2;
Ma question est comment les échanger? Seulement ces variables, pas d'autres objets.
J'ai ces deux variables:
var a = 1,
b = 2;
Ma question est comment les échanger? Seulement ces variables, pas d'autres objets.
Voici une ligne de code pour échanger les valeurs de deux variables.
Étant donné les variables a
et b
:
b = [a, a = b][0];
Démonstration ci-dessous:
var a=1,
b=2,
output=document.getElementById('output');
output.innerHTML="Original: "+a+", "+b+"";
// swap values for variables "a" and "b"
b = [a, a = b][0];
output.innerHTML+="Swapped: "+a+", "+b+"";
@Kay: Il semble également que l'utilisation d'un tableau soit beaucoup plus lente qu'un troisième variable: http://jsperf.com/swap-array-vs-variable J'ai seulement testé cela dans Chrome cependant. Je n'ai pas pu tester la version ECMAScript 6 encore car elle donne actuellement une erreur Invalid left-hand side in assignment
.
@FrançoisWahl Bon point. Je pense que la plupart des réponses ici fonctionneront et sont assez équivalentes. Je suppose que c'est un compromis entre l'utilisation de variables temporaires, la quantité de code et la vitesse.
Vous pouvez le faire :
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
Pour la lisibilité et la maintenabilité, rien ne vaut cela (du moins en JavaScript). Toute personne chargée de la maintenance du code (y compris vous-même dans six mois) saura exactement ce qui se passe.
Comme ce sont des entiers, vous pouvez également utiliser un certain nombre de techniques astucieuses1 pour échanger sans utiliser de troisième variable. Par exemple, vous pouvez utiliser l'opérateur xor bits :
let a = 1, b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log('a is now:', a);
console.log('b is now:', b);
Il s'agit de l'algorithme d'échange XOR. Sa théorie de fonctionnement est décrite dans cet article Wikipedia.
1"Le programmeur compétent est pleinement conscient de la taille limitée de son propre crâne. Il aborde donc sa tâche avec une pleine humilité et évite les astuces astucieuses comme la peste." — Edsger W. Dijkstra
Xor fonctionnera avec n'importe quel type de données. C'est l'astuce de soustraction qui ne fonctionnera qu'avec des nombres.
@RobertGrant - L'opérateur xor en JavaScript convertit ses opérandes en entiers de 32 bits (en utilisant la méthode interne ToInt32
- voir la Section 11.10 de la norme ECMAScript). Il ne produit pas les résultats corrects pour les valeurs numériques non entières. Il convertit également les valeurs non numériques en entiers de 32 bits. Si vous commencez avec a = "hi"
et b = "there"
, vous finissez avec a == 0
et b == 0
.
Ce truc fonctionne avec n'importe quel type de données, à condition que vous ne vous souciez pas d'un résultat entier; les valeurs sont automatiquement converties en int32. Cela signifie qu'il peut fonctionner avec des chaînes numériques, des booléens (0/1), null (0) et des tableaux/objets vides (0). Bien que le type d'origine ne soit pas préservé, donc les booléens affectés ne fonctionneraient pas avec typeof a == 'boolean'
ou a === false
, par exemple. Les nombres réels fonctionnent, sauf qu'ils sont arrondis vers zéro au lieu d'être arrondis à l'entier le plus proche.
N'utilisez pas le code ci-dessous. Ce n'est pas la manière recommandée d'échanger les valeurs de deux variables (utilisez simplement un variable temporaire à cette fin). Cela montre juste une astuce en JavaScript.
Cette solution n'utilise pas de variables temporaires, pas de tableaux, seulement une addition, et c'est rapide. En fait, elle est parfois plus rapide qu'une variable temporaire sur plusieurs plateformes.
Elle fonctionne pour tous les nombres, ne déborde jamais et gère les cas particuliers tels que Infinity et NaN.
a = b + (b=a, 0)
Elle fonctionne en deux étapes :
(b=a, 0)
définit b
à la vieille valeur de a
et retourne 0
a = b + 0
définit a
à la vieille valeur de b
La version avec une variable temporaire est légèrement plus rapide, plus générale et plus lisible également. jsperf.com/swap-two-numbers-without-tmp-var/9
L'opérateur entre parenthèses est l'opérateur de virgule ,
, et il a été enveloppé pour définir la priorité correcte. L'opérateur de virgule évalue les deux de ses arguments (dans ce cas b=a
et 0
) et renvoie le dernier (dans ce cas 0
). Ainsi, ici, cela a pour effet de définir la nouvelle valeur de b
à l'ancienne valeur de a
, tout en renvoyant 0
.
Utilisez une troisième variable comme ceci :
var a = 1,
b = 2,
c = a;
a = b; // doit être le premier sinon a et b finissent par être tous les deux à 1
b = c;
DEMO - Utilisation d'une troisième variable
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
8 votes
Swap (informatique)#Utilisation d'une variable temporaire ...