Odpowiedzi:
Oto jedna linijka służąca do zamiany wartości dwóch zmiennych.
Podane zmienne a
i b
:
b = [a, a = b][0];
Demonstracja poniżej:
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
wyświetla błąd.
ES6 (Firefox i Chrome już to obsługują (Destruifying Assignment Array Matching)):
let a = 5, b = 6;
[a, b] = [b, a];
console.log(`${a} ${b}`);
Możesz to zrobić:
var a = 1,
b = 2,
tmp;
tmp = a;
a = b;
b = tmp;
Jeśli chodzi o czytelność i łatwość konserwacji, nie można tego przebić (przynajmniej w JavaScript). Każdy, kto zajmuje się kodem (w tym Ty za sześć miesięcy), będzie dokładnie wiedział, co się dzieje.
Ponieważ są to liczby całkowite, możesz również użyć dowolnej liczby sprytnych sztuczek 1 do zamiany bez używania trzeciej zmiennej. Na przykład możesz użyć bitowego operatora xor:
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);
Nazywa się to algorytmem wymiany XOR. Jego teorię działania opisano w tym artykule w Wikipedii .
1 „Kompetentny programista jest w pełni świadomy ograniczonych rozmiarów własnej czaszki. Dlatego podchodzi do swojego zadania z pełną pokorą i unika sprytnych sztuczek, takich jak zaraza”. - Edsger W. Dijkstra
ToInt32
metody wewnętrznej - patrz Rozdział 11.10 standardu ECMAScript ). Nie daje poprawnych wyników dla wartości liczbowych innych niż całkowite. Konwertuje również wartości nienumeryczne na 32-bitowe liczby całkowite. Jeśli zaczniesz od a = "hi"
i b = "there"
, otrzymasz a == 0
i b == 0
.
typeof a == 'boolean'
lub a === false
. Liczby rzeczywiste działają, z wyjątkiem tego, że są wyliczane w kierunku zera w porównaniu z zaokrągleniem do najbliższej liczby całkowitej.
Nie używaj poniższego kodu. To nie zalecanym sposobem, aby zamienić wartości dwóch zmiennych (wystarczy użyć zmiennej tymczasowej dla tego). Pokazuje tylko sztuczkę JavaScript.
To rozwiązanie nie wykorzystuje zmiennych tymczasowych, żadnych tablic, tylko jeden dodatek i jest szybkie . W rzeczywistości jest czasami szybszy niż zmienna tymczasowa na kilku platformach .
Działa dla wszystkich liczb, nigdy się nie przepełnia i obsługuje przypadki skrajne, takie jak Infinity i NaN.
a = b + (b=a, 0)
Działa w dwóch krokach:
(b=a, 0)
ustawia b
na starą wartość a
i daje0
a = b + 0
ustawia a
starą wartośćb
,
i został zawinięty w celu ustawienia prawa pierwszeństwa. Operator przecinka ocenia oba argumenty (w tym przypadku b=a
i 0
) i zwraca ostatni (w tym przypadku 0
). Więc tutaj ma to wpływ na ustawienie nowej b
wartości starej a
, przy jednoczesnym uzyskaniu 0
.
Oto jeden-liner, zakładając a
i b
już istnieją i mają wartości, która chciałaby zostać zamienione:
var c=a, a=b, b=c;
Jak wspomniał @Kay, w rzeczywistości działa to lepiej niż metoda tablicowa (prawie 2x szybciej).
var a, b, tmp;
a = 1
:; b = 2
; tmp=a, a=b, b=tmp;
Własny gust.
Metoda ES6 +: Od wersji ES6 można bardziej elegancko wymieniać zmienne. Możesz użyć destrukturyzacji dopasowywania tablic przypisania. Po prostu. var a = 10 b = 20;
[a, b] = [b, a]
console.log (a, b) // 20 10
Teraz możesz wreszcie zrobić:
let a = 5;
let b = 10;
[a, b] = [b, a]; // ES6
console.log(a, b);
Możesz użyć tymczasowej zmiennej wymiany lub XOR.
a = a ^ b
b = a ^ b
a = a ^ b
To tylko podstawowa koncepcja logiczna i działa w każdym języku obsługującym operacje XOR.
edycja: zobacz komentarze. Zapomniałem powiedzieć, że działa to na pewno tylko w przypadku liczby całkowitej. Założono zmienne całkowite z wątku pytania
Możesz użyć przypisania niszczącego ES6 w następujący sposób:
let a = 10;
let b = 20;
[a, b] = [b, a];
console.log(a, b); // a = 20, b = 10
Ponieważ Twoje pytanie było cenne „Tylko te zmienne, a nie żadne przedmioty”, odpowiedź również będzie cenna:
var a = 1, b = 2
a=a+b;
b=a-b;
a=a-b;
to sztuczka
I jak powiedział Rodrigo Assis, „może być krótsze”
b=a+(a=b)-b;
Destrukturyzacja ES6:
Korzystanie z tablicy: [a, b] = [b, a]; // my favorite
Korzystanie z obiektu: {a, b} = {a:b, b:a}; // not bad neither
Jak moglibyśmy przegapić te klasyczne onelinery
var a = 1, b = 2
a = ({a:b, _:(b=a)}).a;
I
var a = 1, b = 2
a = (_=b,b=a,_);
Ostatnia z nich ujawnia zmienną globalną „_”, ale nie powinno to mieć znaczenia, ponieważ typowa konwencja javascript polega na używaniu jej jako zmiennej „dont care”.
a = (_=b,b=a,_);
_
? Dlaczego nie wymaga deklaracji?
Widzę tu coś w rodzaju olimpiady programowania. Jeszcze jedno skomplikowane rozwiązanie jednowierszowe:
b = (function(){ a=b; return arguments[0]; })(a);
Skrzypce: http://jsfiddle.net/cherniv/4q226/
arguments
, po prostu zrób b = (function (x){ return x; })(a, a=b)
.
arguments
widzenia lista byłaby również zmienną.
a
do arguments[0]
, przekazując go jako parametr.
arguments
a jego przypisanie odbywa się „za kulisami”
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);
usuń lub skomentuj dwa // lub i uruchom z jednym zestawem kodu
Jesteśmy w stanie zamienić var w ten sposób:
var val1 = 117,
val2 = 327;
val2 = val1-val2;
console.log(val2);
val1 = val1-val2;
console.log(val1);
val2 = val1+val2;
console.log(val2);
W ES6 jest teraz destrukcyjne przypisanie i możesz:
let a = 1;
let b = 2;
[b, a] = [a, b] // a = 2, b = 1
let a = 2, b = 4;
[b, a] = [a, b];
byłoby bardziej rozwlekłe podejście
let a = 2, b = 4;
a = [a, b];
b = a[0];
a = a[1];
To bardzo proste, użyj składni niszczenia tablic ES6, która zawiera [y, x] = [x, y]
więcej informacji, klikając ten link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destruifying_assignment
Do ES5, aby zamienić dwie liczby, musisz utworzyć zmienną tymczasową, a następnie zamienić ją. Ale w ES6 bardzo łatwo jest zamienić dwie liczby za pomocą destrukturyzacji tablic. Zobacz przykład.
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
Ponieważ słyszę, że ta metoda działa wolniej:
b = [a, a = b][0];
Jeśli planujesz przechowywać swoje vary w obiekcie (lub tablicy), ta funkcja powinna działać:
function swapVars(obj, var1, var2){
let temp = obj[var1];
obj[var1] = obj[var2];
obj[var2] = temp;
}
Stosowanie:
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'}
Możemy użyć IIFE do zamiany dwóch wartości bez dodatkowego parametru
var a = 5, b =8;
b = (function(a){
return a
}(a, a=b));
document.write("a: " + a+ " b: "+ b);
Destrukturyzacja tablicy ES6 jest używana do zamiany dwóch zmiennych. Zobacz przykład
var [x,y]=[1,2];
[x,y]=[y,x];
Łatwiej to możliwe dzięki:
x === 1
i y === 2
; Ale po destrukturyzacji x
jest y
, czyli 2
i y
jest x
, tj 1
.
Zamień za pomocą Bitwise
let a = 10;
let b = 20;
a ^= b;
y ^= a;
a ^= b;
Zamiana jednej linii „przy użyciu tablicy”
[a, b] = [b, a]
(funkcja (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));