Risposte:
Ecco un one-liner per scambiare i valori di due variabili.
Variabili date a
e b
:
b = [a, a = b][0];
Dimostrazione di seguito:
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
errore.
ES6 (Firefox e Chrome già lo supportano (Destructuring Assignment Array Matching)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
Puoi farlo:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
Per leggibilità e manutenibilità, questo non può essere battuto (almeno in JavaScript). Chiunque mantenga il codice (incluso te tra sei mesi) saprà esattamente cosa sta succedendo.
Dato che si tratta di numeri interi, è anche possibile utilizzare qualsiasi numero di trucchi intelligenti 1 per scambiare senza utilizzare una terza variabile. Ad esempio è possibile utilizzare l'operatore xor bit a bit:
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);
Questo è chiamato l'algoritmo di scambio XOR. La sua teoria del funzionamento è descritta in questo articolo di Wikipedia .
1 "Il programmatore competente è pienamente consapevole delle dimensioni limitate del proprio cranio. Si avvicina quindi al suo compito con piena umiltà ed evita trucchi intelligenti come la peste." - Edsger W. Dijkstra
ToInt32
metodo interno, vedere la Sezione 11.10 dello standard ECMAScript ). Non produce i risultati corretti per valori numerici non interi. Converte anche valori non numerici in numeri interi a 32 bit. Se inizi con a = "hi"
e b = "there"
, finisci con a == 0
e b == 0
.
typeof a == 'boolean'
o a === false
, ad esempio. I numeri reali funzionano, tranne per il fatto che sono spostati verso zero rispetto a arrotondati all'intero più vicino.
Non utilizzare il codice qui sotto. È non il metodo consigliato per scambiare i valori di due variabili (semplicemente utilizzare una variabile temporanea per questo). Mostra solo un trucco JavaScript.
Questa soluzione non utilizza variabili temporanee, matrici, solo un'aggiunta ed è veloce . In effetti, a volte è più veloce di una variabile temporanea su più piattaforme .
Funziona con tutti i numeri, non trabocca mai e gestisce casi limite come Infinity e NaN.
a = b + (b=a, 0)
Funziona in due passaggi:
(b=a, 0)
imposta b
sul vecchio valore di a
e cede0
a = b + 0
imposta a
sul vecchio valore dib
,
ed è stato racchiuso per impostare la precedenza a destra. L'operatore virgola valuta entrambi i suoi argomenti (in questo caso b=a
e 0
) e restituisce l'ultimo (in questo caso 0
). Quindi qui, ha l'effetto di impostare il nuovo b
sul vecchio valore di a
, mentre cede 0
.
Ecco un one-liner, supponendo a
che b
esistano già e che abbiano valori che devono essere scambiati:
var c=a, a=b, b=c;
Come accennato da @Kay, questo in realtà funziona meglio del modo array (quasi il doppio della velocità).
var a, b, tmp;
a = 1
:; b = 2
; tmp=a, a=b, b=tmp;
Gusto personale.
Metodo ES6 +: da ES6, è possibile scambiare le variabili in modo più elegante. È possibile utilizzare la corrispondenza dell'array di assegnazioni destrutturanti. È semplicemente. var a = 10 b = 20;
[a, b] = [b, a]
console.log (a, b) // 20 10
Ora puoi finalmente fare:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
È possibile utilizzare una variabile di scambio temporanea o XOR.
a = a ^ b
b = a ^ b
a = a ^ b
Questo è solo un concetto logico di base e funziona in tutte le lingue che supportano il funzionamento di XOR.
modifica: vedi i commenti. Hai dimenticato di dire che questo funziona sicuramente solo con numeri interi. Presuppone le variabili intere dal thread della domanda
È possibile utilizzare il compito di destrutturazione ES6 in questo modo:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Poiché la tua domanda era preziosa "Solo queste variabili, non alcun oggetto", anche la risposta sarà preziosa:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
è un trucco
E come diceva Rodrigo Assis, "può essere più breve"
b=a+(a=b)-b;
ES6 Destructuring:
Utilizzando un array: [a, b] = [b, a]; // my favorite
Utilizzando un oggetto: {a, b} = {a:b, b:a}; // not bad neither
Come potremmo perdere questi classici oneliner
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
E
var a = 1, b = 2
a = (_=b,b=a,_);
L'ultimo espone la variabile globale '_' ma ciò non dovrebbe importare come tipica convenzione javascript è usarla come variabile 'non importa'.
a = (_=b,b=a,_);
_
? Perché non ha bisogno di una dichiarazione?
Vedo un po 'di olimpiadi di programmazione qui. Un'altra soluzione complicata a una riga:
b = (function(){ a=b; return arguments[0]; })(a);
arguments
, basta farlo b = (function (x){ return x; })(a, a=b)
.
arguments
elenco sarebbe anche una variabile.
a
ad arguments[0]
passando come parametro.
arguments
e la sua assegnazione avviene "dietro le quinte"
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);
rimuovi o commenta i 2 // o ed esegui con un unico set di codice
Siamo in grado di scambiare var in questo modo:
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 ora c'è un compito di destrutturazione e puoi fare:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
let a = 2, b = 4;
[b, a] = [a, b];
un approccio più dettagliato sarebbe
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
È molto semplice, usa la sintassi di destrutturazione dell'array ES6 che è [y, x] = [x, y]
per maggiori informazioni consulta questo link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
Fino a ES5, per scambiare due numeri, è necessario creare una variabile temp e quindi scambiarla. Ma in ES6, è molto facile scambiare due numeri usando la distruzione dell'array. Vedi esempio.
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
Perché sento che questo metodo funziona più lentamente:
b = [a, a = b][0];
Se hai intenzione di archiviare i tuoi var in un oggetto (o array), questa funzione dovrebbe funzionare:
function swapVars(obj, var1, var2){
let temp = obj[var1];
obj[var1] = obj[var2];
obj[var2] = temp;
}
Uso:
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'}
Possiamo usare IIFE per scambiare due valori senza parametro aggiuntivo
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
La destrutturazione dell'array ES6 viene utilizzata per scambiare due variabili. vedi esempio
var [x,y]=[1,2];
[x,y]=[y,x];
Modo più semplice possibile con:
x === 1
e y === 2
; Ma dopo la destrutturazione, x
è y
, cioè 2
, ed y
è x
, cioè 1
.
Scambia usando Bitwise
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
Scambio a linea singola "utilizzando array"
[a, b] = [b, a]
(funzione (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));