Comment échanger deux variables en JavaScript
20 réponses
Voici un one-liner pour échanger les valeurs de deux variables.
b = [a, a = b][0];
Extrait:
var a=1,
b=2,
output=document.getElementById('output');
output.innerHTML="<p>Original: "+a+", "+b+"</p>";
b = [a, a = b][0];
output.innerHTML+="<p>Swapped: "+a+", "+b+"</p>";
<div id="output"></div>
Vous pouvez faire ceci:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
Pour la lisibilité et la maintenabilité, cela ne peut pas être battu (au moins en JavaScript). Quiconque maintient le code (y compris vous dans six mois) saura exactement ce qui se passe.
Comme ce sont des entiers, vous pouvez également utiliser n'importe quel nombre de trucs astucieux1 pour échanger sans utiliser une troisième variable. Par exemple, vous pouvez utiliser l'opérateur XOR au niveau du BIT:
var a = 1,
b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
C'est ce qu'on appelle l'algorithme d'échange XOR. Sa théorie de fonctionnement est décrit dans cet article de Wikipédia.
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 toute l'humilité, et évite les astuces astucieuses comme la peste." - Edsger W. Dijkstra
ES6 (Firefox et Chrome le supportent déjà (affectation de déstructuration Tableau Correspondant)):
[a,b] = [b,a];
N'utilisez pas le code ci-dessous. C'est Pas la manière recommandée d'échanger les valeurs de deux variables (simplement utiliser une variable temporaire pour cela). Il montre juste une astuce JavaScript.
Cette solution n'utilise pas de variables temporaires, pas de tableaux, un seul ajout, et c'est rapide.
En fait, il est parfois plus rapide qu'une variable temporaire sur plusieurs plateformes.
Cela fonctionne pour tous les nombres, ne déborde jamais et gère Edge-cas tels que Infinity et NaN.
a = b + (b=a, 0)
, Il fonctionne en deux étapes:
-
(b=a, 0)
ensembles deb
à l'ancienne valeur dea
et les rendements0
-
a = b + 0
définita
sur l'ancienne valeur deb
Voici un one-liner, en supposant que a
et b
existent déjà et ont des valeurs à échanger:
var c=a, a=b, b=c;
Comme @ Kay l'a mentionné, ce fonctionne réellement mieux que la manière de tableau (presque 2x aussi vite).
Depuis ES6, vous pouvez également échanger des variables plus élégamment:
var a = 1,
b = 2;
[a, b] = [b, a];
console.log('a:', a, 'b:', b); // a: 2 b: 1
Utilisez une troisième variable comme ceci:
var a = 1,
b = 2,
c = a;
a = b; // must be first or a and b end up being both 1
b = c;
DÉMO - à l'Aide d'une troisième variable
Vous pouvez utiliser une variable d'échange temporaire ou XOR.
a = a ^ b
b = a ^ b
a = a ^ b
Ceci est juste un concept logique de base et fonctionne dans toutes les langues qui prennent en charge l'opération XOR.
Edit: voir les Commentaires. Oublié de dire que cela fonctionne à coup sûr seulement avec integer. Supposé les variables entières du thread de la question
Comme votre question était précieuse " seules ces variables, pas d'objets. ", la réponse sera aussi précieuse:
Var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
C'est un truc
Et comme L'a dit Rodrigo Assis, il "peut être plus court"
b=a+(a=b)-b;
Vous pouvez maintenant enfin faire:
var a = 5;
var b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
ES6 Déstructuration:
Utilisation d'un tableau: [a, b] = [b, a]; // my favorite
Utilisation d'un objet: {a, b} = {a:b, b:a}; // not bad neither
Méthode ES6+ : Depuis ES6, vous pouvez échanger des variables plus élégamment. Vous pouvez utiliser la correspondance de tableau d'affectation de déstructuration. C'est tout simplement. var a = 10 b = 20;
[a, b] = [b, a]
Console.log(A,B) / / 20 10
Comment pourrions-nous manquer ces oneliners Classiques
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
Et
var a = 1, b = 2
a = (_=b,b=a,_);
Le dernier expose la variable globale ' _ ' mais cela ne devrait pas avoir d'importance car la convention javascript typique est de l'utiliser comme variable 'dont care'.
var a = 5;
var b = 10;
b = [a, a = b][0];
//or
b = [a, a = b];
b = b[0];
//or
b = [a, b];
a = b[1];
b = b[0];
alert("a=" + a + ',' + "b=" + b);
Supprimez ou commentez les 2 / / ou et exécutez avec le seul jeu de code
Dans ES6 maintenant il y a une affectation de déstructuration et vous pouvez faire:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
Je vois une sorte d'Olympiade de programmation ici. Une solution d'une ligne plus délicate:
b = (function(){ a=b; return arguments[0]; })(a);
Nous pouvons échanger var comme ceci:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
let a = 2, b = 4;
[b, a] = [a, b];
Une approche plus verbeuse serait
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
(function(A, B){ b=A; a=B; })(parseInt(un), parseInt(b));