Antworten:
Hier ist ein Einzeiler, um die Werte zweier Variablen auszutauschen.
Gegebene Variablen a
und b
:
b = [a, a = b][0];
Demonstration unten:
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>
[a, b] = [b, a];
.
Invalid left-hand side in assignment
Fehler auftritt.
ES6 (Firefox und Chrome unterstützen es bereits (Destructuring Assignment Array Matching)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
Du kannst das:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
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:
let a = 1, b = 2;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log('a is now:', a);
console.log('b is now:', b);
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
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 mit a = "hi"
und beginnen b = "there"
, enden Sie mit a == 0
und b == 0
.
typeof a == 'boolean'
oder funktionieren a === 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.
a = b + (b=a, 0)
Es funktioniert in zwei Schritten:
(b=a, 0)
setzt b
auf den alten Wert von a
und ergibt0
a = b + 0
setzt a
auf den alten Wert vonb
,
und wurde umbrochen, um das Vorrangrecht festzulegen. Der Kommaoperator wertet beide Argumente aus (in diesem Fall b=a
und 0
) und gibt das letzte (in diesem Fall 0
) zurück. Hier hat es also den Effekt, das Neue b
auf den alten Wert von zu setzen a
und gleichzeitig nachzugeben 0
.
Hier ist ein Einzeiler, der davon ausgeht a
und b
bereits existiert und Werte hat, die ausgetauscht werden müssen:
var c=a, a=b, b=c;
Wie @Kay bereits erwähnt hat, ist dies tatsächlich besser als das Array (fast 2x so schnell).
var a, b, tmp;
a = 1
; b = 2
;; tmp=a, a=b, b=tmp;
Persönlicher Geschmack.
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
Sie können jetzt endlich tun:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
Sie können eine temporäre Swap-Variable oder XOR verwenden.
a = a ^ b
b = a ^ b
a = a ^ b
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
Sie können die ES6- Destrukturierungszuweisung wie folgt verwenden:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Da Ihre Frage wertvoll war "Nur diese Variablen, keine Objekte.", Ist die Antwort auch wertvoll:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
Es ist ein Trick.
Und wie Rodrigo Assis sagte, kann es "kürzer sein".
b=a+(a=b)-b;
ES6-Destrukturierung:
Verwenden eines Arrays: [a, b] = [b, a]; // my favorite
Verwenden eines Objekts: {a, b} = {a:b, b:a}; // not bad neither
Wie könnten wir diese klassischen Oneliner vermissen?
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
Und
var a = 1, b = 2
a = (_=b,b=a,_);
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.
a = (_=b,b=a,_);
_
? Warum braucht es keine Erklärung?
Ich sehe hier eine Art Programmierolympiade. Noch eine knifflige einzeilige Lösung:
b = (function(){ a=b; return arguments[0]; })(a);
arguments
, tun Sie es einfach b = (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"
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);
Entfernen oder kommentieren Sie die 2 // oder und führen Sie sie mit dem einen Satz Code aus
Wir können var wie folgt tauschen:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
In ES6 gibt es jetzt eine Destrukturierungszuweisung und Sie können Folgendes tun:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
let a = 2, b = 4;
[b, a] = [a, b];
Ein ausführlicherer Ansatz wäre
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
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_assignment
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.
let x,y;
[x,y]=[2,3];
console.log(x,y); // return 2,3
[x,y]=[y,x];
console.log(x,y); // return 3,2
Weil ich höre, dass diese Methode langsamer läuft:
b = [a, a = b][0];
Wenn Sie Ihre Variablen in einem Objekt (oder Array) speichern möchten, sollte diese Funktion funktionieren:
function swapVars(obj, var1, var2){
let temp = obj[var1];
obj[var1] = obj[var2];
obj[var2] = temp;
}
Verwendung:
let test = {a: 'test 1', b: 'test 2'};
console.log(test); //output: {a: 'test 1', b: 'test 2'}
swapVars(test, 'a', 'b');
console.log(test); //output: {a: 'test 2', b: 'test 1'}
Wir können das IIFE verwenden, um zwei Werte ohne zusätzlichen Parameter auszutauschen
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
Die ES6-Array-Destrukturierung wird verwendet, um zwei Variablen auszutauschen. Siehe Beispiel
var [x,y]=[1,2];
[x,y]=[y,x];
Einfacher Weg möglich mit:
x === 1
und y === 2
; Aber nach der Destrukturierung x
ist y
, dh 2
und y
ist x
, dh 1
.
Mit Bitwise tauschen
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
Einzeiliger Swap "using Array"
[a, b] = [b, a]
(Funktion (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));