Mam te dwie zmienne:
var a = 1,
b = 2;
Moje pytanie brzmi, jak je zamienić? Tylko te zmienne, a nie żadne obiekty.
javascript
variables
swap
Lukas
źródło
źródło
Odpowiedzi:
Oto jedna linijka służąca do zamiany wartości dwóch zmiennych.
Podane zmienne
a
ib
:Demonstracja poniżej:
źródło
[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)):
źródło
Możesz to zrobić:
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:
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
źródło
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 oda = "hi"
ib = "there"
, otrzymasza == 0
ib == 0
.typeof a == 'boolean'
luba === 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.
Działa w dwóch krokach:
(b=a, 0)
ustawiab
na starą wartośća
i daje0
a = b + 0
ustawiaa
starą wartośćb
źródło
,
i został zawinięty w celu ustawienia prawa pierwszeństwa. Operator przecinka ocenia oba argumenty (w tym przypadkub=a
i0
) i zwraca ostatni (w tym przypadku0
). Więc tutaj ma to wpływ na ustawienie nowejb
wartości stareja
, przy jednoczesnym uzyskaniu0
.a = b + (b=a, "")
Od wersji ES6 możesz także zamieniać zmienne bardziej elegancko:
źródło
Oto jeden-liner, zakładając
a
ib
już istnieją i mają wartości, która chciałaby zostać zamienione:Jak wspomniał @Kay, w rzeczywistości działa to lepiej niż metoda tablicowa (prawie 2x szybciej).
źródło
var a, b, tmp;
a = 1
:;b = 2
;tmp=a, a=b, b=tmp;
Własny gust.Użyj trzeciej zmiennej, takiej jak ta:
DEMO - Korzystanie z trzeciej zmiennej
źródło
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
źródło
Teraz możesz wreszcie zrobić:
źródło
Możesz użyć tymczasowej zmiennej wymiany lub XOR.
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
źródło
Możesz użyć przypisania niszczącego ES6 w następujący sposób:
źródło
Ponieważ Twoje pytanie było cenne „Tylko te zmienne, a nie żadne przedmioty”, odpowiedź również będzie cenna:
var a = 1, b = 2
to sztuczka
I jak powiedział Rodrigo Assis, „może być krótsze”
Demo: http://jsfiddle.net/abdennour/2jJQ2/
źródło
Destrukturyzacja ES6:
Korzystanie z tablicy:
[a, b] = [b, a]; // my favorite
Korzystanie z obiektu:
{a, b} = {a:b, b:a}; // not bad neither
źródło
Jak moglibyśmy przegapić te klasyczne onelinery
I
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”.
źródło
a = (_=b,b=a,_);
_
? Dlaczego nie wymaga deklaracji?Widzę tu coś w rodzaju olimpiady programowania. Jeszcze jedno skomplikowane rozwiązanie jednowierszowe:
Skrzypce: http://jsfiddle.net/cherniv/4q226/
źródło
arguments
, po prostu zróbb = (function (x){ return x; })(a, a=b)
.arguments
widzenia lista byłaby również zmienną.a
doarguments[0]
, przekazując go jako parametr.arguments
a jego przypisanie odbywa się „za kulisami”Zamiana jednej linii
źródło
usuń lub skomentuj dwa // lub i uruchom z jednym zestawem kodu
http://jsfiddle.net/USdv8/57/
źródło
Jesteśmy w stanie zamienić var w ten sposób:
źródło
W ES6 jest teraz destrukcyjne przypisanie i możesz:
źródło
byłoby bardziej rozwlekłe podejście
źródło
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źródło
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.
źródło
Ponieważ słyszę, że ta metoda działa wolniej:
Jeśli planujesz przechowywać swoje vary w obiekcie (lub tablicy), ta funkcja powinna działać:
Stosowanie:
źródło
Możemy użyć IIFE do zamiany dwóch wartości bez dodatkowego parametru
źródło
Destrukturyzacja tablicy ES6 jest używana do zamiany dwóch zmiennych. Zobacz przykład
Łatwiej to możliwe dzięki:
x === 1
iy === 2
; Ale po destrukturyzacjix
jesty
, czyli2
iy
jestx
, tj1
.źródło
Zamień za pomocą Bitwise
Zamiana jednej linii „przy użyciu tablicy”
źródło
(funkcja (A, B) {b = A; a = B;}) (parseInt (a), parseInt (b));
źródło