web-dev-qa-db-fra.com

Comment échanger deux variables en JavaScript

J'ai ces deux variables:

var a = 1,
    b = 2;

Ma question est comment les échanger? Seulement ces variables, pas tous les objets.

147
Lukas

Voici une ligne pour permuter les valeurs de deux variables.
Variables données a et b:

b = [a, a = b][0];

Démonstration ci-dessous:

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>
298
showdev

ES6 (Firefox et Chrome le prennent déjà en charge (Destructuring Assignment Array Matching)):

let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
147
Pedro Justo

Tu peux le faire:

var a = 1,
    b = 2,
    tmp;
tmp = a;
a = b;
b = tmp;

Pour des raisons de lisibilité et de maintenabilité, il est imbattable (du moins en JavaScript). Quiconque entretient le code (y compris dans six mois) saura exactement ce qui se passe.

S'agissant de nombres entiers, vous pouvez également utiliser un nombre illimité d'astuces intelligentes.1 pour échanger sans utiliser une troisième variable. Par exemple, vous pouvez utiliser l'opérateur xwise 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écrite dans cet article de Wikipedia .

1 "Le programmeur compétent est parfaitement conscient de la taille limitée de son propre crâne. Il aborde donc sa tâche avec une humilité absolue et évite les astuces intelligentes comme la peste." - Edsger W. Dijkstra

117
Ted Hopp

N'utilisez pas le code ci-dessous. C'est pas la méthode recommandée pour échanger les valeurs de deux variables (simplement tilisez une variable temporaire pour cela). Il montre juste une astuce JavaScript.

Cette solution n'utilise aucune variable temporaire, aucun tableau, une seule addition et c'est rapide . En fait, il est parfois plus rapide qu'une variable temporaire sur plusieurs plates-formes.
Il fonctionne pour tous les nombres, ne déborde jamais et gère les cas Edge tels que Infinity et NaN.

a = b + (b=a, 0)

Cela fonctionne en deux étapes:

  • (b=a, 0) définit b sur l'ancienne valeur de a et donne 0
  • a = b + 0 définit a sur l'ancienne valeur de b
56
Ruben Verborgh

Voici une ligne, en supposant que a et b existent déjà et que des valeurs doivent être permutées:

var c=a, a=b, b=c;

Comme @Kay l'a mentionné, ceci fonctionne mieux que le mode tableau (presque 2x aussi vite).

17
bobobobo

Depuis ES6, vous pouvez également échanger des variables de manière plus élégante:

var a = 1,
    b = 2;

[a, b] = [b, a];

console.log('a:', a, 'b:', b); // a: 2 b: 1
13
Peter

Utilisez une troisième variable comme celle-ci:

var a = 1,
    b = 2,
    c = a;

a = b; // must be first or a and b end up being both 1
b = c;

DEMO - Utilisation d'une troisième variable


9
Nope

Méthode ES6 +: depuis ES6, vous pouvez échanger les variables de manière plus élégante. Vous pouvez utiliser la correspondance de tableau d'affectation de déstructuration. C’est simplement. var a = 10 b = 20;

[a, b] = [b, a]

console.log (a, b) // 20 10

8
Jalak Patoliya

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 prenant en charge le fonctionnement XOR.

edit: voir les commentaires. J'ai oublié de dire que cela ne fonctionne à coup sûr qu'avec un entier. En supposant que les variables entières du fil de la question

8
DmiN

ES6 Destructuring:

Utiliser un tableau: [a, b] = [b, a]; // my favorite

Utiliser un objet: {a, b} = {a:b, b:a}; // not bad neither

6
Flavien Volken

Comme votre question était précieuse "Seules ces variables, pas tous les objets.", La réponse sera également précieuse:

var a = 1, b = 2

a=a+b;
b=a-b;
a=a-b;

c'est un tour

Et comme l'a dit Rodrigo Assis, "cela peut être plus court"

 b=a+(a=b)-b;

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

6
Abdennour TOUMI

Vous pouvez maintenant enfin faire:

var a = 5;
var b = 10;

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

console.log(a, b);
6
mehulmpt

Comment pourrions-nous manquer ces classiques oneliners

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 consiste à l'utiliser comme variable 'ne pas en prendre soin'.

3
Teemu Ikonen
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);

supprime ou commente les 2 // ou et exécute avec le seul jeu de code

http://jsfiddle.net/USdv8/57/

2
Thilak Raj

Dans ES6, il y a maintenant une assignation de déstructuration et vous pouvez faire:

let a = 1;
let b = 2;
[b, a] = [a, b]  // a = 2, b = 1
2
Stanislav Bozhanov

Permutation d'une seule ligne

a = a^b^(b^=(a^b));
2
Saruselvi

Je vois une sorte de programmation olympiade ici. Une solution plus complexe sur une ligne:

b = (function(){ a=b; return arguments[0]; })(a);

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

1
Cherniv
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
Enogwe Victor

Nous pouvons échanger des 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
Mohammed Javed

Vous pouvez utiliser ES6 affectation de déstructuration comme suit:

[a, b] = [b, a];
1
Manuel Abascal

C'est très simple, utilisez la syntaxe de déstructuration du tableau ES6 ES6 qui est [y, x] = [x, y] pour plus d'informations, consultez ce lien https: // développeur .mozilla.org/fr-US/docs/Web/JavaScript/Référence/Opérateurs/Destructuring_assignment

0
Naved Ahmad