Ich habe diese zwei Variablen:
var a = 1,
b = 2;
Meine Frage ist, wie man sie tauscht? Nur diese Variablen, keine Objekte.
javascript
variables
swap
Lukas
quelle
quelle
Antworten:
Hier ist ein Einzeiler, um die Werte zweier Variablen auszutauschen.
Gegebene Variablen
a
undb
:Demonstration unten:
quelle
[a, b] = [b, a];
.Invalid left-hand side in assignment
Fehler auftritt.ES6 (Firefox und Chrome unterstützen es bereits (Destructuring Assignment Array Matching)):
quelle
Du kannst das:
Aus Gründen der Lesbarkeit und Wartbarkeit ist dies nicht zu übertreffen (zumindest in JavaScript). Jeder, der den Code verwaltet (einschließlich Sie in sechs Monaten), weiß genau, was los ist.
Da es sich um Ganzzahlen handelt, können Sie auch eine beliebige Anzahl cleverer Tricks anwenden 1 verwenden , um ohne Verwendung einer dritten Variablen zu tauschen. Zum Beispiel können Sie den bitweisen xor-Operator verwenden:
Dies wird als XOR-Swap-Algorithmus bezeichnet. Seine Betriebstheorie wird in diesem Wikipedia-Artikel beschrieben .
1 "Der kompetente Programmierer ist sich der begrenzten Größe seines eigenen Schädels voll bewusst. Er geht seine Aufgabe daher mit voller Demut an und vermeidet clevere Tricks wie die Pest." - Edsger W. Dijkstra
quelle
ToInt32
internen Methode - siehe Abschnitt 11.10 des ECMAScript-Standards ). Es werden nicht die richtigen Ergebnisse für nicht ganzzahlige numerische Werte erzeugt. Es konvertiert auch nicht numerische Werte in 32-Bit-Ganzzahlen. Wenn Sie mita = "hi"
und beginnenb = "there"
, enden Sie mita == 0
undb == 0
.typeof a == 'boolean'
oder funktionierena === false
. Reelle Zahlen funktionieren, außer dass sie gegen Null oder auf die nächste ganze Zahl gerundet sind.Verwenden Sie nicht den folgenden Code. Es ist nicht die empfohlene Methode, die Werte zweier Variablen auszutauschen (verwenden Sie einfach eine temporäre Variable ). Es zeigt nur einen JavaScript-Trick.
Diese Lösung verwendet keine temporären Variablen, keine Arrays, nur eine Addition und ist schnell . Tatsächlich ist es auf mehreren Plattformen manchmal schneller als eine temporäre Variable .
Es funktioniert für alle Zahlen, läuft nie über und verarbeitet Randfälle wie Infinity und NaN.
Es funktioniert in zwei Schritten:
(b=a, 0)
setztb
auf den alten Wert vona
und ergibt0
a = b + 0
setzta
auf den alten Wert vonb
quelle
,
und wurde umbrochen, um das Vorrangrecht festzulegen. Der Kommaoperator wertet beide Argumente aus (in diesem Fallb=a
und0
) und gibt das letzte (in diesem Fall0
) zurück. Hier hat es also den Effekt, das Neueb
auf den alten Wert von zu setzena
und gleichzeitig nachzugeben0
.a = b + (b=a, "")
Seit ES6 können Sie Variablen auch eleganter austauschen:
quelle
Hier ist ein Einzeiler, der davon ausgeht
a
undb
bereits existiert und Werte hat, die ausgetauscht werden müssen:Wie @Kay bereits erwähnt hat, ist dies tatsächlich besser als das Array (fast 2x so schnell).
quelle
var a, b, tmp;
a = 1
;b = 2
;;tmp=a, a=b, b=tmp;
Persönlicher Geschmack.Verwenden Sie eine dritte Variable wie folgt:
DEMO - Verwenden einer dritten Variablen
quelle
ES6 + -Methode: Seit ES6 können Sie Variablen eleganter austauschen. Sie können den Matching-Zuordnungsarray-Abgleich verwenden. Es ist einfach. var a = 10 b = 20;
[a, b] = [b, a]
console.log (a, b) // 20 10
quelle
Sie können jetzt endlich tun:
quelle
Sie können eine temporäre Swap-Variable oder XOR verwenden.
Dies ist nur ein grundlegendes logisches Konzept und funktioniert in jeder Sprache, die den XOR-Betrieb unterstützt.
Bearbeiten: siehe Kommentare. Ich habe vergessen zu sagen, dass dies mit Sicherheit nur mit Ganzzahlen funktioniert. Angenommen, die ganzzahligen Variablen stammen aus dem Thread der Frage
quelle
Sie können die ES6- Destrukturierungszuweisung wie folgt verwenden:
quelle
Da Ihre Frage wertvoll war "Nur diese Variablen, keine Objekte.", Ist die Antwort auch wertvoll:
var a = 1, b = 2
Es ist ein Trick.
Und wie Rodrigo Assis sagte, kann es "kürzer sein".
Demo: http://jsfiddle.net/abdennour/2jJQ2/
quelle
ES6-Destrukturierung:
Verwenden eines Arrays:
[a, b] = [b, a]; // my favorite
Verwenden eines Objekts:
{a, b} = {a:b, b:a}; // not bad neither
quelle
Wie könnten wir diese klassischen Oneliner vermissen?
Und
Die letzte macht die globale Variable '_' verfügbar, aber das sollte keine Rolle spielen, da die typische Javascript-Konvention darin besteht, sie als Variable 'dont care' zu verwenden.
quelle
a = (_=b,b=a,_);
_
? Warum braucht es keine Erklärung?Ich sehe hier eine Art Programmierolympiade. Noch eine knifflige einzeilige Lösung:
Geige: http://jsfiddle.net/cherniv/4q226/
quelle
arguments
, tun Sie es einfachb = (function (x){ return x; })(a, a=b)
.arguments
wäre die Liste auch eine Variable.a
zu,arguments[0]
indem Sie es als Parameter übergeben.arguments
und seine Zuordnung geschieht "hinter den Kulissen"Einzeiliger Austausch
quelle
Entfernen oder kommentieren Sie die 2 // oder und führen Sie sie mit dem einen Satz Code aus
http://jsfiddle.net/USdv8/57/
quelle
Wir können var wie folgt tauschen:
quelle
In ES6 gibt es jetzt eine Destrukturierungszuweisung und Sie können Folgendes tun:
quelle
Ein ausführlicherer Ansatz wäre
quelle
Es ist sehr einfach, die ES6- Array-Destrukturierungssyntax
[y, x] = [x, y]
zu verwenden. Weitere Informationen finden Sie unter folgendem Link: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignmentquelle
Bis ES5 müssen Sie zum Auswechseln von zwei Zahlen eine temporäre Variable erstellen und diese dann austauschen. In ES6 ist es jedoch sehr einfach, zwei Zahlen mithilfe der Array-Destrukturierung auszutauschen. Siehe Beispiel.
quelle
Weil ich höre, dass diese Methode langsamer läuft:
Wenn Sie Ihre Variablen in einem Objekt (oder Array) speichern möchten, sollte diese Funktion funktionieren:
Verwendung:
quelle
Wir können das IIFE verwenden, um zwei Werte ohne zusätzlichen Parameter auszutauschen
quelle
Die ES6-Array-Destrukturierung wird verwendet, um zwei Variablen auszutauschen. Siehe Beispiel
Einfacher Weg möglich mit:
x === 1
undy === 2
; Aber nach der Destrukturierungx
isty
, dh2
undy
istx
, dh1
.quelle
Mit Bitwise tauschen
Einzeiliger Swap "using Array"
quelle
(Funktion (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));
quelle