J'ai ces deux variables:
var a = 1,
b = 2;
Ma question est comment les échanger? Seulement ces variables, pas tous les objets.
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>
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}`);
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
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
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).
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
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
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
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
ES6 Destructuring:
Utiliser un tableau: [a, b] = [b, a]; // my favorite
Utiliser un objet: {a, b} = {a:b, b:a}; // not bad neither
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;
Vous pouvez maintenant enfin faire:
var a = 5;
var b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
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'.
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
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
Permutation d'une seule ligne
a = a^b^(b^=(a^b));
Je vois une sorte de programmation olympiade ici. Une solution plus complexe sur une ligne:
b = (function(){ a=b; return arguments[0]; })(a);
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];
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);
Vous pouvez utiliser ES6 affectation de déstructuration comme suit:
[a, b] = [b, a];
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