Comment échanger deux variables en JavaScript

J'ai ces deux variables:

var a = 1,
    b = 2;

Ma question Est de savoir comment les échanger? Seulement ces variables, pas tous les objets.

123
demandé sur Lukas 2013-04-25 00:35:13

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>
263
répondu showdev 2017-03-13 06:46:43

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

102
répondu Ted Hopp 2015-11-27 16:58:47

ES6 (Firefox et Chrome le supportent déjà (affectation de déstructuration Tableau Correspondant)):

[a,b] = [b,a];
102
répondu Pedro Justo 2016-05-04 15:11:33

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 de b à l'ancienne valeur de a et les rendements 0
  • a = b + 0 définit a sur l'ancienne valeur de b
54
répondu Ruben Verborgh 2017-05-23 12:26:35

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

13
répondu bobobobo 2013-11-19 01:37:11

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
10
répondu Peter 2015-11-04 10:24:31

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


9
répondu Nope 2013-04-24 21:21:51

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

8
répondu DmiN 2013-04-24 20:44:44

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;

Démo: http://jsfiddle.net/abdennour/2jJQ2/

6
répondu Abdennour TOUMI 2013-04-24 21:23:08

Vous pouvez maintenant enfin faire:

var a = 5;
var b = 10;

[a, b] = [b, a]; // ES6

console.log(a, b);
5
répondu mehulmpt 2017-04-05 07:34:39

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

4
répondu Flavien Volken 2018-02-13 07:34:22

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

3
répondu Jalak Patoliya 2018-09-29 08:22:39

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'.

2
répondu Teemu Ikonen 2013-09-12 19:47:44

Permutation D'une seule ligne

a = a^b^(b^=(a^b));
2
répondu Saruselvi 2014-01-24 12:39:32
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

Http://jsfiddle.net/USdv8/57/

2
répondu Thilak Raj 2015-03-26 05:17:58

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
2
répondu Stanislav Bozhanov 2017-08-02 11:23:01

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);

Violon: http://jsfiddle.net/cherniv/4q226/

1
répondu Cherniv 2013-11-21 07:49:47

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);
1
répondu Mohammed Javed 2015-01-13 10:35:34
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];
1
répondu Enogwe Victor 2018-02-13 02:11:55

(function(A, B){ b=A; a=B; })(parseInt(un), parseInt(b));

-2
répondu Carlos Correia 2017-01-25 18:03:56