Moją ulubioną metodą jest użycie !!
. Jest to również metoda zalecana przez przewodnik po stylu JavaScript Airbnb 👍
Boolean(value);!!value;
# Convert Values to Boolean
# String
const string = 'string';!!string; // trueBoolean(string); // true
# Number
const number = 100;!!number; // trueBoolean(number); // true
# Falsy Values
W JavaScript, istnieje 6 wartości falsy. Jeśli przekonwertujesz dowolną z nich na boolean
, zwróci ona false
.
falseundefinednullNaN0"" (empty string)
Wszystko, co nie znajduje się na liście falsy, zwróci true
👍
Więcej informacji na ten temat, możesz przeczytać mój kod Uwagi o wartościach falsy
# Przykłady
Zastosowanie !!
na wartościach falsy
!!false; // false!!undefined; // false!!null; // false!!NaN; // false!!0; // false!!''; // false
Zastosowanie Boolean
na falsy values
Boolean(false); // falseBoolean(undefined); // falseBoolean(null); // falseBoolean(NaN); // falseBoolean(0); // falseBoolean(''); // false
# Jak działa !! działa
Pierwszy !
coerce wartość do boolean i odwrócenie go. W tym przypadku, !value
zwróci false
. Aby więc odwrócić go z powrotem do true
, umieszczamy na nim kolejny !
. Stąd podwójne użycie !!
.
const value = 'string';!value; // false!!value; // true
# Uważaj na 'false'
const value = 'false';!!value; // trueBoolean(value); // true
Zauważ, że "false"
znajduje się pomiędzy cudzysłowami '
. Chociaż mówi false
, to w rzeczywistości jest to ciąg znaków. Wiem, że większość z was nie wpadnie na to, ale jeśli jesteś taki jak ja, możesz po prostu chcieć być czujny na te zabawne sztuczki umysłowe, które ludzie mogą grać na tobie 😂
# Community Input
@tassoevan : Lubię filtrować fałszywe wartości z tablic takich jak ta: myArray.filter(Boolean)
@fleonus : Lubię !+!
tylko po to, żeby być fajnym i odrzucać ludzi 😛
# Speed Test
Tutaj jest test, który znalazłem:
boolean vs !!!
Wygląda na to, że !!
jest nieco szybszy niż Boolean
# Którego użyć?
Dostałem wiele komentarzy na temat tego postu. Niektórzy wolą Boolean
ponieważ jest bardziej jednoznaczny.
Ale, Kyle Simpson z You Don’t Know JS, wspomniał, że oba są jednoznaczne.
// better (works explicitly):if (!!a) {}// also great (works explicitly):if (Boolean(a)) {}
Kyle Simpson: YDKJS – Coercion
Nie sądzę, żebym miał dla ciebie świetną odpowiedź. Będziesz znał swój zespół o wiele lepiej niż ja. Nadal będę używał !!
w moich osobistych projektach, ponieważ jest to mniej pisania i rozumiem tę składnię. Ale gdybym był w zespole, mógłbym wybrać Boolean
, ponieważ myślę, że większość programistów lepiej by to zrozumiała. Bez względu na to, który z nich wybierzesz, najważniejszą rzeczą jest bycie konsekwentnym. Nie przerzucaj się między tymi dwoma w swojej bazie kodu. Wybierz jeden i trzymaj się go 💪
Aludacja do niesamowitego komentarza, który dostałem:
@patrick_developer: Mówię, że jeden powinien zrozumieć oba na wszelki wypadek, gdy zostanie przedstawiony z różnymi bazami kodu, które używają każdego z nich. Wiedza to potęga.
Innymi słowy, jeden nie jest lepszy od drugiego. Ten, który bym twierdził, jest bardziej preferencją. Więc nie możesz się pomylić. Ale nie pozbawiaj się zrozumienia obu. Jak powiedział Patrick, „Wiedza to potęga” 💪
# Unikaj nowych Boolean
Use Primitives instead of Object Types
var str = 'str';// Avoidtypeof new Boolean(str); // object// Preferredtypeof Boolean(str); // booleantypeof !!str; // boolean
CJ J.: Warto zauważyć, że new Boolean
nie jest booleanem, ale raczej instancją Boolean. Prymitywy są tańsze i powinny być preferowane w stosunku do typu obiektu.
CJ J.: new Boolean(str)
zwraca typ obiektu. Boolean(str)
po prostu zwraca prymitywny boolean. Podejrzewałbym, że Boolean(str)
jest szybszy niż !!str
, ponieważ jest to tylko jedna operacja, ale jest również całkowicie możliwe, że przeglądarki implementują optymalizację, taką, że kiedy widzą !!
wiedzą, aby bezpośrednio rzucić argument na prymityw boolean (zamiast faktycznie robić NOT()
dwa razy z rzędu).
CJ J.: Prymitywy są tanie, ponieważ są niezmienne, więc możesz dzielić się referencjami i nie musisz trzymać żadnego stanu na instancji. To tylko true
lub false
. Ale new Boolean(str)
jest obiektem. Ma swój własny unikalny adres pamięci i może przechowywać wewnętrzny stan, który jest unikalny dla niego. Oznacza to, że nie może po prostu trzymać referencji do niezmiennej instancji singleton. Każde wywołanie new Boolean(str)
instantiates cały nowy Boolean()
obiekt.
Dzięki: CJ J .
# Remove empty strings with Boolean Constructor
CJ J.: To jest klasyczny przykład. Jeśli otrzymasz listę wartości ciągów oddzielonych przecinkami i chcesz odfiltrować puste ciągi, możesz przekazać funkcję konstruktora Boolean do Array.prototype.filter i automatycznie usunie ona ciągi o zerowej długości, pozostawiając tablicę tylko prawidłowych ciągów.
var str = 'some,list,,of,values';var arr = str.split(',');arr; // arr.filter(Boolean); //
Dzięki: CJ J .