J'ai ces deux variables:
var a = 1,
b = 2;
Ma question est de savoir comment les échanger? Seulement ces variables, pas des objets.
javascript
variables
swap
Lukas
la source
la source
Réponses:
Voici une ligne unique pour permuter les valeurs de deux variables.
Données variables
a
etb
:Démonstration ci-dessous:
la source
[a, b] = [b, a];
.Invalid left-hand side in assignment
erreur.ES6 (Firefox et Chrome le prennent déjà en charge (Destructuring Assignment Array Matching)):
la source
Tu peux le faire:
Pour la lisibilité et la maintenabilité, cela est imbattable (du moins en JavaScript). Quiconque maintient le code (y compris vous dans six mois) saura exactement ce qui se passe.
Comme ce sont des nombres entiers, vous pouvez également utiliser n'importe quel nombre d'astuces intelligentes 1 pour permuter sans utiliser une troisième variable. Par exemple, vous pouvez utiliser l'opérateur xor au niveau du bit:
C'est ce qu'on appelle l'algorithme d'échange XOR. Sa théorie de fonctionnement est décrite 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 se rapproche donc sa tâche avec humilité pleine et évite des tours intelligentes comme la peste. » - Edsger W. Dijkstra
la source
ToInt32
méthode interne - voir la section 11.10 du standard 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 32 bits. Si vous commencez para = "hi"
etb = "there"
, vous vous retrouvez aveca == 0
etb == 0
.typeof a == 'boolean'
oua === false
, par exemple. Les nombres réels fonctionnent, sauf qu'ils sont arrondis vers zéro et arrondis à l'entier le plus proche.N'utilisez pas le code ci-dessous. Ce n'est pas la méthode recommandée pour permuter les valeurs de deux variables ( utilisez simplement une variable temporaire pour cela). Cela montre juste une astuce JavaScript.
Cette solution n'utilise aucune variable temporaire, aucun tableau, un seul ajout et c'est rapide . En fait, c'est parfois plus rapide qu'une variable temporaire sur plusieurs plateformes .
Il fonctionne pour tous les nombres, ne déborde jamais et gère les cas extrêmes tels que Infinity et NaN.
Cela fonctionne en deux étapes:
(b=a, 0)
définitb
l'ancienne valeur dea
et donne0
a = b + 0
définita
l'ancienne valeur deb
la source
,
, et il a été encapsulé pour définir la priorité à droite. L'opérateur virgule évalue ses deux arguments (dans ce casb=a
et0
) et renvoie le dernier (dans ce cas0
). Donc ici, cela a pour effet de remettre le nouveaub
à l'ancienne valeur dea
, tout en cédant0
.a = b + (b=a, "")
Depuis ES6, vous pouvez également permuter les variables de manière plus élégante:
la source
Voici un one-liner, supposant
a
etb
existant déjà et ayant des valeurs à échanger:Comme @Kay l'a mentionné, cela fonctionne en fait mieux que le mode tableau (presque 2x plus rapide).
la source
var a, b, tmp;
a = 1
:;b = 2
;tmp=a, a=b, b=tmp;
Goût personnel.Utilisez une troisième variable comme celle-ci:
DEMO - Utilisation d'une troisième variable
la source
Méthode ES6 +: depuis ES6, vous pouvez permuter les 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
la source
Vous pouvez maintenant enfin faire:
la source
Vous pouvez utiliser une variable d'échange temporaire ou XOR.
Ceci est juste un concept logique de base et fonctionne dans toutes les langues prenant en charge le fonctionnement XOR.
modifier: voir les commentaires. J'ai oublié de dire que cela ne fonctionne à coup sûr qu'avec un entier. Supposé les variables entières du fil de discussion de la question
la source
Vous pouvez utiliser l' affectation de déstructuration ES6 comme ceci:
la source
Comme votre question était précieuse "Seulement ces variables, pas aucun objet.", La réponse sera également précieuse:
var a = 1, b = 2
c'est un truc
Et comme l'a dit Rodrigo Assis, ça "peut être plus court"
Démo: http://jsfiddle.net/abdennour/2jJQ2/
la source
Destructuration ES6:
À l'aide d'un tableau:
[a, b] = [b, a]; // my favorite
Utilisation d'un objet:
{a, b} = {a:b, b:a}; // not bad neither
la source
Comment pourrions-nous manquer ces oneliners classiques
Et
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 'ne se soucie pas'.
la source
a = (_=b,b=a,_);
_
? Pourquoi n'a-t-il pas besoin de déclaration?Je vois une sorte d'olympiade de programmation ici. Une autre solution en une ligne délicate:
Violon: http://jsfiddle.net/cherniv/4q226/
la source
arguments
, faites-leb = (function (x){ return x; })(a, a=b)
.arguments
liste serait également une variable.a
àarguments[0]
en passant comme paramètre.arguments
et son assignation se fait "dans les coulisses"Échange de ligne unique
la source
supprimer ou commenter les 2 // ou et exécuter avec le seul ensemble de code
http://jsfiddle.net/USdv8/57/
la source
Nous pouvons échanger des var comme ceci:
la source
Dans ES6, il existe maintenant une affectation de déstructuration et vous pouvez faire:
la source
une approche plus verbeuse serait
la source
C'est très simple, utilisez la syntaxe de déstructuration des tableaux ES6 qui est
[y, x] = [x, y]
pour plus d'informations consultez ce lien https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignmentla source
Jusqu'à ES5, pour échanger deux nombres, vous devez créer une variable temporaire, puis l'échanger. Mais dans ES6, il est très facile d'échanger deux nombres en utilisant la déstructuration des tableaux. Voir exemple.
la source
Parce que j'entends que cette méthode fonctionne plus lentement:
Si vous prévoyez de stocker vos variables dans un objet (ou un tableau), cette fonction devrait fonctionner:
Usage:
la source
Nous pouvons utiliser l'IIFE pour échanger deux valeurs sans paramètre supplémentaire
la source
La déstructuration des tableaux ES6 est utilisée pour permuter deux variables. Voir exemple
Une manière plus simple possible avec:
x === 1
ety === 2
; Mais après déstructuration,x
esty
, c'est2
-à- dire , ety
estx
, c'est-à-dire1
.la source
Swap en utilisant Bitwise
Swap sur une seule ligne "à l'aide d'un tableau"
la source
(fonction (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));
la source