Mam zmienną, która przechowuje false
lub true
, ale muszę 0
albo 1
zamiast, odpowiednio. W jaki sposób mogę to zrobić?
276
Mam zmienną, która przechowuje false
lub true
, ale muszę 0
albo 1
zamiast, odpowiednio. W jaki sposób mogę to zrobić?
bool === true ? 1 : 0
, ponieważ jest to zdecydowanie najszybszy w V8.bool ? 1 : 0;
Odpowiedzi:
JavaScript ma trójskładnikowego operatora, którego możesz użyć:
źródło
NaN
. Więc jeśli chcesz L33T i zagwarantować wejście, idź na mocz, inaczej podejmie test trójskładnikowy + test prawdy jest najlepszy.Użyj jednoargumentowego
+
operatora , który konwertuje swój operand na liczbę.Pamiętaj oczywiście, że nadal powinieneś dezynfekować dane po stronie serwera, ponieważ użytkownik może wysłać dowolne dane do serwera, bez względu na to, co mówi kod po stronie klienta.
źródło
Number()
jest jeszcze wolniejszy.bool === true ? 1 : 0
jest najszybszy, z bliską sekundą odbool | 0
.Imho najlepszym rozwiązaniem jest:
Jest to używane w asm.js do wymuszenia typu całkowitego.
źródło
1
liczby całkowitej, jeśli nie będzie fooBar?Wolę korzystać z funkcji Numer . Pobiera obiekt i konwertuje go na liczbę.
Przykład:
Możesz to przetestować w jsFiddle .
źródło
Stworzyłem JSperf porównanie wszystkich sugerowanych odpowiedzi.
TL; DR - najlepsza opcja dla wszystkich obecnych przeglądarek to:
.
Aktualizacja:
Wygląda na to, że w dzisiejszych czasach wszystkie są dość identyczne, z wyjątkiem tego, że
Number()
funkcja jest najwolniejsza, a jednocześnie najlepszaval === true ? 1 : 0;
.źródło
Typowym sposobem na zrobienie tego byłoby:
źródło
Właśnie dzisiaj spotkałem ten skrót.
~~ (prawda)
~~ (fałsz)
Ludzie o wiele mądrzejsi niż potrafię wyjaśnić:
http://james.padolsey.com/javascript/double-bitwise-not/
źródło
Gdy JavaScript oczekuje wartości liczbowej, ale zamiast tego otrzymuje wartość logiczną, konwertuje tę wartość logiczną na liczbę: odpowiednio prawda i fałsz zamieniają odpowiednio na 1 i 0. Możesz więc z tego skorzystać;
Dalsza lektura Konwersje typów Rozdział 3.8 Ostatecznego przewodnika po Javascript.
źródło
Unary
+
operator zajmie się tym:Naturalnie będziesz chciał to sprawdzić na serwerze przed przechowywaniem, więc i tak może to być bardziej rozsądne miejsce.
źródło
===
, ponieważtrue == 1
jest to prawdą nawet bez wyrażenia „jawna konwersja :-)true === 1
zamiast tego jest fałszywe.Właśnie zajmowałem się tym problemem w jakimś pisanym przeze mnie kodzie. Moim rozwiązaniem było użycie bitowego i.
Szybszym sposobem radzenia sobie ze stałym problemem byłoby utworzenie funkcji. Jest bardziej czytelny dla innych ludzi, lepiej dla zrozumienia na etapie konserwacji i pozbywa się możliwości napisania czegoś złego.
Edycja - 10 września 2014 r
Z jakiegoś powodu żadna konwersja przy użyciu operatora trójskładnikowego z operatorem identycznym do operatora nie jest szybsza w Chrome. Nie ma sensu, dlaczego jest szybszy, ale przypuszczam, że jest to jakaś optymalizacja niskiego poziomu, która ma sens gdzieś po drodze.
Sprawdź sam: http://jsperf.com/boolean-int-conversion/2
W FireFox i Internet Explorer korzystanie z opublikowanej wersji jest ogólnie szybsze.
Edycja - 14 lipca 2017 r
Okej, nie powiem ci, którego powinieneś, a czego nie powinieneś. Każda cholerna przeglądarka poruszała się w górę iw dół pod względem szybkości wykonywania każdej metody. W pewnym momencie Chrome miał lepszą wersję bitową i wersję niż inne, ale nagle stało się znacznie gorzej. Nie wiem co robią, więc zostawię to komu to obchodzi. Rzadko jest jakiś powód, aby martwić się o szybkość takiej operacji. Nawet na urządzeniach mobilnych jest to operacja nic.
Oto nowa metoda dodawania prototypu „toInt”, której nie można zastąpić.
źródło
Możesz także dodać 0, użyć operatorów shift lub xor:
Mają one podobne prędkości jak odpowiedzi innych.
źródło
W moim kontekście React Native, w którym otrzymuję wartość krycia z wartości logicznej, najprostszy sposób: użyj operatora unary +.
Konwertuje to wartość logiczną na liczbę;
źródło
Możesz to zrobić, po prostu rozszerzając prototyp logiczny
Nie jest łatwo zrozumieć, co się tam dzieje, więc byłaby to alternatywna wersja
po zrobieniu tego, co możesz zrobić
Kiedy używam booleanów do przechowywania warunków, często przekształcam je w pola bitowe, w którym to przypadku używam rozszerzonej wersji funkcji prototypowej
z którymi możesz zrobić
co daje 4 jako wynik.
źródło
źródło
próbować
Pokaż fragment kodu
źródło
Przetestowałem wszystkie te przykłady, zrobiłem test porównawczy i na koniec polecam wybrać krótszy, nie ma to wpływu na wydajność.
Wynik
źródło
jeśli chcesz zmienić wartość całkowitą x, jeśli 1 na 0 i jeśli 0 na 1, możesz użyć (x + 1)% 2
źródło