Widziałem jakiś kod, który wydaje się używać operatora nie uznaję, w postaci dwóch wykrzykników, tak: !!
. Czy ktoś może mi powiedzieć, co robi ten operator?
Kontekst, w którym to widziałem, był
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
javascript
operators
Teoria sześciokąta
źródło
źródło
if(vertical !== undefined) this.vertical = Boolean(vertical);
- jest o wiele czystsze i bardziej zrozumiałe, co się dzieje, nie wymaga niepotrzebnego przypisania, jest całkowicie standardowe i jest równie szybkie (w obecnych wersjach FF i Chrome) jsperf.com/boolean-conversion-speed .Boolean(5/0)
!!5/0
!!5/0
produkujeInfinity
zamiasttrue
, jak produkowane przezBoolean(5/0)
.!!5/0
jest równoważne(!!5)/0
- akatrue/0
- ponieważ!
operator ma wyższy priorytet niż/
operator. Jeśli chcesz logować się5/0
za pomocą podwójnego huku, musisz użyć!!(5/0)
.Odpowiedzi:
Konwertuje
Object
naboolean
. Gdyby to było falsey (np0
,null
,undefined
, itd.), To będziefalse
, w przeciwnym razietrue
.Więc
!!
to nie jest operator, to tylko!
operator dwa razy.Przykład ze świata rzeczywistego „Testuj wersję IE”:
Jeśli ⇒
Ale jeśli ⇒
źródło
To strasznie niejasny sposób na konwersję typu.
!
NIE jest . Tak!true
jestfalse
i!false
jesttrue
.!0
jesttrue
i!1
jestfalse
.Więc konwertujesz wartość na wartość logiczną, następnie odwracasz ją, a następnie ponownie odwracasz.
źródło
userId ? true : false
wyjaśnia, że trwa konwersja i obsługuje przypadek, w którym wartość userId mogła zostać jawnie ustawiona naundefined
!!var
doBoolean(var)
… i!!
jest szybszy (mniej instrukcji do przetworzenia) i krótszy niż alternatywy.userId != 0
odnosi się donull
,NaN
iundefined
, ale za fałszywefalse
. Jeśli chcesz dokładnie takie zachowanie, prawdopodobnie powinieneś wyrazić się jasno na ten temat. Ale nawet jeśli zadziałało dokładnie tak samo jak!!userId
, nie jest jasne, czy chcesz , aby te wartości były fałszywe, czy też po prostu nie wziąłeś pod uwagę reguł konwersji typów JavaScript.!!expr
zwraca wartość logiczną (true
lubfalse
) w zależności od prawdziwości wyrażenia. Ma to większy sens, gdy jest używane w przypadku typów innych niż boolowskie. Rozważ te przykłady, zwłaszcza trzeci przykład i kolejne:źródło
!!new Boolean(false) // true
!!Boolean(false) // false
new Boolean(false)
jest przedmiotem, a obiekt jest prawdziwy, nawet jeśli zawiera wartość fałszu!String
,Number
,Date
, etc) mają być wpłacone jako funkcje zbyt, ale w tym przypadku wynik jest inny!new Boolean(false)
zwracaobject
chwilę, aBoolean(false)
zwraca element podstawowyfalse
. Mam nadzieję, że to ma sens.Zaparz herbatę:
!!
nie jest operatorem. Jest to podwójne zastosowanie!
- który jest logicznym operatorem „nie”.W teorii:
!
określa „prawdę” tego, czym nie jest wartość:Prawda jest taka, że
false
nie jesttrue
(dlatego!false
wyniki wtrue
)Prawda jest taka, że
true
nie jestfalse
(dlatego!true
wyniki wfalse
)!!
określa „prawdę” tego, czym nie jest wartość :Prawdą jest, że
true
nie jest nietrue
(dlatego!!true
skutkujetrue
)Prawdą jest, że
false
nie jest niefalse
(dlatego!!false
skutkujefalse
)To, co chcemy porównać w porównaniu, to „prawda” o wartości odwołania, a nie wartość samego odniesienia. Jest przypadek użycia, w którym możemy chcieć poznać prawdę o wartości, nawet jeśli oczekujemy, że wartość będzie
false
(lub falsey), lub jeśli spodziewamy się, że wartość nie będzie typuboolean
.W praktyce:
Rozważ zwięzłą funkcję, która wykrywa funkcjonalność funkcji (i w tym przypadku zgodność platformy) za pomocą dynamicznego pisania (inaczej „kaczego pisania”). Chcemy napisać funkcję, która zwraca,
true
jeśli przeglądarka użytkownika obsługuje<audio>
element HTML5 , ale nie chcemy, aby funkcja generowała błąd, jeśli<audio>
jest niezdefiniowany; i nie chcemy używaćtry ... catch
do obsługi ewentualnych błędów (ponieważ są obrzydliwe); a także nie chcemy używać kontroli wewnątrz funkcji, która nie będzie konsekwentnie ujawniać prawdy o tej funkcji (na przykładdocument.createElement('audio')
nadal tworzy element wywoływany,<audio>
nawet jeśli HTML5<audio>
nie jest obsługiwany).Oto trzy podejścia:
Każda funkcja akceptuje argumenty dla
<tag>
iattribute
do wyszukania, ale każda zwraca inne wartości w zależności od tego, co określają porównania.Ale czekaj, jest więcej!
Niektórzy z was pewnie zauważyli, że w tym konkretnym przykładzie można po prostu sprawdzić właściwość, używając nieco bardziej wydajnych środków sprawdzania, czy przedmiotowy obiekt ma właściwość. Można to zrobić na dwa sposoby:
Dygresujemy ...
Jakkolwiek rzadko zdarzają się takie sytuacje, może istnieć kilka scenariuszy, w których
true
użycie najbardziej zwięzłych, najbardziej wydajnych, a zatem najbardziej preferowanych sposobów uzyskiwania od wartości nie-logicznej, być może nieokreślonej!!
. Mam nadzieję, że to absurdalnie to wyjaśnia.źródło
if()
instrukcja już rzutuje wyrażenie na wartość logiczną, jawne rzutowanie wartości zwracanej funkcji testowej na wartość logiczną jest zbędne - ponieważ „prawdomówność” === jest prawdą w takim zakresie, w jakimif()
oświadczenie się zgadza . A może brakuje mi scenariusza, w którym POTRZEBUJESZ prawdziwego wyrażenia, aby być naprawdę boolowskimtrue
?if()
rzucają wartości logiczne na wartości falsey, ale mówią, że chcesz ustawić flagę boolowską na obiekcie - nie rzutuje to tak jakif()
instrukcja. Na przykładobject.hasTheThing = !!castTheReturnValToBoolNoMatterWhat()
ustawi jednątrue
lubfalse
zamiast rzeczywistej wartości zwracanej. Innym przykładem może być to wszystkie administratorów sąid
z0
i nie-administratorów są id1
lub wyższej. Aby uzyskać,true
jeśli ktoś nie jest administratorem, możesz to zrobićperson.isNotAdmin = !!admin.id
. Niewiele przypadków użycia, ale jest zwięzły, gdy jest.!!
konwertuje wartość po jej prawej stronie na równoważną wartość logiczną. (Pomyśl o sposobie „castingu” biednego człowieka). Jego celem jest zazwyczaj przekazanie czytelnikowi, że w kodzie nie ma znaczenia, jaką wartość ma zmienna, ale jaka jest jej wartość „prawda” .źródło
!
nadal odwraca wartość w prawo. W przypadku wartości logicznej skrajna prawa strona!
neguje wartość, a!
skrajna lewa ponownie ją neguje. Efektem netto jest to, że nie ma zmian, ale większość silników wygeneruje kody operacji dla podwójnej negacji.if(0){...
JavaScript już wie, że to nieprawda. Dlaczego lepiej powiedziećif(!!0){...
?!!foo
stosuje dwukrotnie operator unary not i jest używany do rzutowania na typ logiczny podobny do użycia unary plus+foo
do rzutowania na liczbę i łączenia pustego ciągu''+foo
do rzutowania na ciąg.Zamiast tych hacków można również użyć funkcji konstruktora odpowiadających typom pierwotnym ( bez użycia
new
), aby jawnie rzutować wartości, tj.źródło
new
- jak wyraźnie wspomniano w mojej odpowiedzix="0"
po prostu zrób:x=!!+x; //false
co jest tym samym, coBoolean(Number(x))
liczba (lub + x) konwertuje ciąg „0” na 0, co ZALICZA wartość false, a następnie wartość boolowska (!! x) rzutuje to na wartość logiczną bezpośrednio. Bułka z masłem!!!+x
vsx !== "0"
?Tak wiele odpowiedzi robi połowę pracy. Tak,
!!X
można to odczytać jako „prawdziwość X [przedstawionej jako logiczna]”. Ale!!
praktycznie nie jest tak ważne, aby dowiedzieć się, czy pojedyncza zmienna jest (a nawet jeśli wiele zmiennych jest) prawdą czy fałszem.!!myVar === true
jest taki sam jak sprawiedliwymyVar
. Porównywanie!!X
do „prawdziwych” wartości logicznych nie jest tak naprawdę przydatne.Co można zyskać ze
!!
jest możliwość sprawdzenia truthiness wielu zmiennych przeciwko siebie w powtarzalny, standaryzowane (a) JSLint przyjazny sposób.Po prostu casting :(
To jest...
0 === false
jestfalse
.!!0 === false
jesttrue
.Powyższe nie jest tak przydatne.
if (!0)
daje takie same wyniki jakif (!!0 === false)
. Nie mogę wymyślić dobrego argumentu za rzutowaniem zmiennej na wartość logiczną, a następnie na porównanie z „prawdziwą” wartością logiczną.Zobacz „== i! =” Ze wskazówek JSLinta (uwaga: Crockford trochę przesuwa swoją stronę; ten link może umrzeć w pewnym momencie), aby dowiedzieć się, dlaczego:
Należy zauważyć, że istnieją nieintuicyjne przypadki, w których wartość logiczna zostanie rzutowana na liczbę (
true
jest rzutowana na1
ifalse
na0
) podczas porównywania wartości logicznej z liczbą. W takim przypadku!!
może być przydatny psychicznie. Chociaż znowu są to przypadki, w których porównujesz nie-boolean z booleanem o twardym typie, co jest, imo, poważnym błędem.if (-1)
jest wciąż do zrobienia tutaj.A wszystko staje się jeszcze bardziej szalone w zależności od silnika. Na przykład WScript wygrywa nagrodę.
Z powodu jakiegoś historycznego jive Windowsa , to wyświetli -1 w oknie komunikatu! Wypróbuj w wierszu polecenia cmd.exe i przekonaj się! Ale
WScript.echo(-1 == test())
wciąż daje ci 0 lub WScriptfalse
. Odwracać wzrok. To ohydne.Porównywanie prawdy :)
Ale co, jeśli mam dwie wartości, muszę sprawdzić równość truthi / falsi-nizm?
Udawaj, że mamy
myVar1 = 0;
imyVar2 = undefined;
.myVar1 === myVar2
jest0 === undefined
i jest oczywiście fałszywe.!!myVar1 === !!myVar2
jest!!0 === !!undefined
i jest prawdą! Ta sama prawda! (W tym przypadku oba „mają prawdziwość fałszu”).Tak więc jedynym miejscem, w którym naprawdę potrzebowałbyś użyć „zmiennych obsadzonych logicznie” byłoby, gdybyś miał sytuację, w której sprawdzasz, czy obie zmienne mają tę samą prawdziwość, prawda? To znaczy, użyj,
!!
jeśli chcesz zobaczyć, czy dwie zmienne są prawdomówne, czy obie fałszywe (lub nie), to znaczy o równej (lub nie) prawdomówności .Nie mogę wymyślić świetnego, nieskomplikowanego przypadku użycia dla tego odręcznego. Może masz „połączone” pola w formularzu?
Więc teraz, jeśli masz prawdę dla obu lub fałsz zarówno dla nazwiska małżonka, jak i wieku, możesz kontynuować. W przeciwnym razie masz tylko jedno pole z wartością (lub bardzo wczesne małżeństwo) i musisz stworzyć dodatkowy błąd w swojej
errorObjects
kolekcji.EDYCJA 24 października 2017 r., 6 lutego 19:
Biblioteki stron trzecich, które oczekują wyraźnych wartości logicznych
Oto interesujący przypadek ...
!!
może być przydatny, gdy biblioteki innych firm oczekują wyraźnych wartości logicznych.Na przykład Fałsz w JSX (React) ma specjalne znaczenie, które nie jest wywoływane w przypadku zwykłego fałszu. Jeśli próbowałeś zwrócić coś takiego w JSX, oczekując int w
messageCount
...{messageCount && <div>You have messages!</div>}
... możesz być zaskoczony, gdy React renderuje,
0
gdy masz zero wiadomości. Musisz jawnie zwrócić wartość false, aby JSX nie renderował. Powyższa instrukcja zwraca0
, którą JSX chętnie renderuje, tak jak powinien. Nie może powiedzieć, że nie miałeśCount: {messageCount && <div>Get your count to zero!</div>}
(lub czegoś mniej wymyślonego).Jedna poprawka wymaga bangbang, przekształcająca
0
się!!0
, co jestfalse
:{!!messageCount && <div>You have messages!</div>}
Dokumenty JSX sugerują, abyś był bardziej jednoznaczny, napisał kod do komentowania i użył porównania, aby wymusić wartość logiczną.
{messageCount > 0 && <div>You have messages!</div>}
Bardziej komfortowo radzę sobie z fałszowaniem za pomocą trójki -
{messageCount ? <div>You have messages!</div> : false}
Ta sama sprawa w Typescript: Jeśli masz funkcję, która zwraca wartość logiczną (lub przypisujesz wartość zmiennej boolean), zwykle nie możesz zwrócić / przypisać wartości boolean-y; musi to być silnie typ logiczny. Oznacza to, że iff
myObject
jest silnie wpisany ,return !myObject;
działa dla funkcji zwracającej wartość logiczną, alereturn myObject;
nie działa. Musiszreturn !!myObject
dopasować się do oczekiwań maszynopisu.Pamiętaj, że są to konwencje JSX i maszynopisu , a nie te związane z JavaScript .
Ale jeśli widzisz dziwne
0
znaki w renderowanym JSX, pomyśl luźne zarządzanie fałszem.źródło
if (!!window.Worker)
true
„zewnętrznie” działają dokładnie tak samoif
. Wciąż próbuję, ale nie mogę wymyślić powodu, dla którego wolałbym przekazywać prawdomówność na wartość boolowską poza takim złożonym przypadkiem „porównaj prawdy” powyżej, z wyjątkiem czytelności, jeśli użyjesz tej wartości później, jak wq
przykładzie z biblioteki . Ale nawet wtedy jest to skrót do utraty informacji i twierdzę, że lepiej za każdym razem oceniać prawdziwość.To tylko logiczny operator NOT, dwa razy - służy do konwersji czegoś na wartość logiczną, np .:
źródło
Konwertuje przyrostek na wartość logiczną.
źródło
To podwójna
not
operacja. Pierwszy!
konwertuje wartość na wartość logiczną i odwraca jej wartość logiczną. Drugi!
odwraca wartość logiczną z powrotem.źródło
Wydaje się, że
!!
operator skutkuje podwójną negacją.źródło
Symuluje zachowanie
Boolean()
funkcji rzutowania. PierwszyNOT
zwraca wartość logiczną bez względu na podany operand. DrugiNOT
neguje tęBoolean
wartość i dlatego podajetrue
wartość logiczną zmiennej. Wynik końcowy jest taki sam, jak użycieBoolean()
funkcji dla wartości.źródło
! to „boolean not”, który zasadniczo rzutuje wartość „enable” na swoją logiczną wartość przeciwną. Drugi ! odwraca tę wartość. Tak,
!!enable
oznacza „nie należy włączać”, co daje wartośćenable
jako wartość logiczną.źródło
Myślę, że warto wspomnieć, że warunek połączony z logicznym AND / OR nie zwróci wartości logicznej, ale ostatni sukces lub pierwszy błąd w przypadku && i pierwszy sukces lub ostatni błąd w przypadku || łańcucha warunków.
Aby przerzucić warunek na prawdziwy logiczny literał, możemy użyć podwójnej negacji:
źródło
!!
używaNOT
operacji dwa razy razem,!
przekonwertuj wartość na aboolean
i odwróć ją, oto prosty przykład, aby zobaczyć, jak!!
działa:Na początku masz miejsce:
Następnie zrobisz to
!0
, zostanie przekonwertowane na wartość logiczną i zostanie ocenione natrue
, ponieważ 0 jestfalsy
, więc otrzymasz odwróconą wartość i przekonwertowane na wartość logiczną, więc zostanie to ocenione natrue
.ale nie chcemy odwróconej boolowskiej wersji wartości, więc możemy ją odwrócić, aby uzyskać nasz wynik! Dlatego używamy innego
!
.Zasadniczo,
!!
upewnij się, że otrzymujemy wartość boolowską, a nie fałsz, prawdę, łańcuch itp.To tak, jakby używać
Boolean
funkcji w javascript, ale w łatwy i krótszy sposób przekonwertować wartość na wartość logiczną:źródło
!!
Konstrukt jest prostym sposobem toczenia dowolne wyrażenie JavaScript do jej logicznego odpowiednika.Na przykład:
!!"he shot me down" === true
i!!0 === false
.źródło
0 === false
jest fałszywe i!!0 === false
prawdziwe.To nie jest pojedynczy operator, to dwa. Jest to równoważne z poniższym i jest szybkim sposobem na rzutowanie wartości na wartość logiczną.
źródło
Podejrzewam, że jest to pozostałość po C ++, gdzie ludzie nadpisują! operator, ale nie operator bool.
Aby uzyskać odpowiedź negatywną (lub pozytywną) w takim przypadku, najpierw musisz użyć! operator, aby uzyskać wartość logiczną, ale jeśli chcesz sprawdzić, pozytywny przypadek użyłby !!.
źródło
if
Iwhile
oświadczenia oraz?
wartości stosowanie prawdy operatora w celu określenia, która gałąź uruchomienie kodu. Na przykład liczby zero i NaN oraz pusty ciąg są fałszywe, ale inne liczby i ciągi są prawdziwe. Obiekty są prawdziwe, ale nieokreślona wartość inull
oba są fałszywe.Operator podwójnej negacji
!!
oblicza wartość prawdy wartości. W rzeczywistości są to dwa operatory, które!!x
oznaczają!(!x)
i zachowują się następująco:x
jest wartością fałszywą,!x
jesttrue
i!!x
jestfalse
.x
jest prawdziwą wartością,!x
jestfalse
i!!x
jesttrue
.W przypadku zastosowania na górnym poziomie logicznej związku (
if
,while
, i?
), przy czym!!
podmiot jest behawioralnie nie-OP. Na przykładif (x)
iif (!!x)
znaczy to samo.Praktyczne zastosowania
Ma jednak kilka praktycznych zastosowań.
Jednym z zastosowań jest stratna kompresja obiektu do jego wartości prawdziwej, aby Twój kod nie zawierał odniesienia do dużego obiektu i nie utrzymywał go przy życiu. Przypisanie
!!some_big_object
zmiennej zamiastsome_big_object
puszczania jej dla śmieciarza. Jest to przydatne w przypadkach, które generują obiekt lub wartość fałszywą, taką jaknull
wartość niezdefiniowana, na przykład wykrywanie funkcji przeglądarki.Innym zastosowaniem, o którym wspomniałem w odpowiedzi na temat odpowiedniego
!!
operatora C , są narzędzia „kłaczków”, które szukają typowych literówek i diagnostyki drukowania. Na przykład, zarówno w języku C, jak i JavaScript, kilka typowych literówek dla operacji boolowskich wywołuje inne zachowania, których wynik nie jest taki sam jak wartość logiczna:if (a = b)
jest przypisaniem, po którym następuje użycie wartości prawdyb
;if (a == b)
to porównanie równości.if (a & b)
jest nieco bitowe AND;if (a && b)
jest logicznym AND.2 & 5
jest0
(wartość fałszywa);2 && 5
jest prawdziwy.!!
Operator uspokaja narzędzie niestrzępiącą, że to co napisałeś jest to, co masz na myśli: czy ta operacja, a następnie podjąć wartość logiczną wyniku.Trzecim zastosowaniem jest stworzenie logicznego XOR i logicznego XNOR. Zarówno w języku C, jak i JavaScript
a && b
wykonuje logiczne AND (prawda, jeśli obie strony są prawdziwe) ia & b
wykonuje bitowe AND.a || b
wykonuje logicznąa | b
operację OR (prawda, jeśli przynajmniej jedna jest prawdą) i wykonuje bitową operację LUB. Istnieje bitowy XOR (wyłączny OR)a ^ b
, ale nie ma wbudowanego operatora dla logicznego XOR (prawda, jeśli prawda jest dokładnie jedna strona). Możesz na przykład pozwolić użytkownikowi na wprowadzenie tekstu w dokładnie jednym z dwóch pól. Co można zrobić, to przekonwertować każdy o wartości logicznej i porównać je:!!x !== !!y
.źródło
Podwójna negacja boolowska. Często używany do sprawdzania, czy wartość nie jest niezdefiniowana.
źródło
Mnóstwo świetnych odpowiedzi tutaj, ale jeśli przeczytałeś tak daleko, pomogło mi to „zdobyć”. Otwórz konsolę w Chrome (itp.) I zacznij pisać:
Oczywiście wszystkie są takie same jak zwykłe pisanie !! coś, ale dodane nawiasy mogą pomóc w zrozumieniu.
źródło
!!x
jest skrótem odBoolean(x)
Pierwszy huk zmusza silnik js do uruchomienia,
Boolean(x)
ale ma również efekt uboczny polegający na odwróceniu wartości. Drugi huk usuwa efekt uboczny.źródło
Zmusza wszystkie rzeczy do boolean.
Na przykład:
źródło
Odpowiedź na to pytanie jest dość dokładna, ale chciałbym dodać odpowiedź, która, mam nadzieję, jest tak uproszczona, jak to możliwe, dzięki czemu !! tak proste, jak to tylko możliwe.
Ponieważ javascript ma tak zwane wartości „prawdomówne” i „falsey”, istnieją wyrażenia, które po ocenie w innych wyrażeniach spowodują powstanie warunku prawdziwego lub fałszywego, nawet jeśli badana wartość lub wyrażenie nie jest w rzeczywistości
true
lubfalse
.Na przykład:
Jeśli ten element faktycznie istnieje, wyrażenie zostanie ocenione jako prawda, a blok kodu zostanie wykonany.
Jednak:
... NIE spowoduje prawdziwego warunku, a blok kodu nie zostanie wykonany, nawet jeśli element istnieje.
Dlaczego? Ponieważ
document.getElementById()
jest to „prawdomówne” wyrażenie, które w tymif()
stwierdzeniu zostanie ocenione jako prawdziwe , ale nie jest rzeczywistą wartością logicznątrue
.Podwójne „nie” w tym przypadku jest dość proste. To po prostu dwie
not
sekundy do siebie.Pierwszy z nich po prostu „odwraca” wartość prawdy lub falseya, co skutkuje rzeczywistym typem logicznym, a następnie drugi „odwraca” go z powrotem do pierwotnego stanu, ale teraz w rzeczywistą wartość logiczną. W ten sposób masz spójność:
i
ZARÓWNO zwróci true, zgodnie z oczekiwaniami.
źródło
Chciałem tylko to dodać
jest taki sam jak
Ale może to być problem, gdy coś jest niezdefiniowane.
Sztuczka polega na tym, że łańcuch
&&
s zwróci pierwszą znalezioną wartość falsey - i można ją podać do instrukcji if itp. Więc jeśli b.foo jest niezdefiniowany, zwróci niezdefiniowaną i pominieb.foo.bar
instrukcję, a my nie otrzymamy błąd.Powyższy zwrot niezdefiniowana, ale jeśli masz pusty ciąg, fałszywe, null, 0 niezdefiniowane wartości te powrócą i zaraz spotykamy je w sieci -
[]
i{}
to zarówno „truthy” i będziemy kontynuować w dół tak zwany " && chain ”do następnej wartości po prawej stronie.PS Innym sposobem na zrobienie tego samego jest to
(b || {}).foo
, że jeśli b jest niezdefiniowane, tob || {}
będzie{}
, a będziesz uzyskiwał dostęp do wartości w pustym obiekcie (bez błędu) zamiast próbować uzyskać dostęp do wartości w „niezdefiniowanym” (powoduje błąd ). Więc(b || {}).foo
jest taki sam jakb && b.foo
i((b || {}).foo || {}).bar
jest taki sam jakb && b.foo && b.foo.bar
.źródło
({}).anything
, daundefined
Po zobaczeniu wszystkich tych wspaniałych odpowiedzi chciałbym dodać kolejny powód do korzystania
!!
. Obecnie pracuję w Angular 2-4 (TypeScript) i chcę zwrócić wartość logiczną,false
gdy mój użytkownik nie jest uwierzytelniony. Jeśli nie jest uwierzytelniony, ciągiem tokenów będzienull
lub""
. Mogę to zrobić, używając następnego bloku kodu:źródło
oto fragment kodu z kątowego js
ich zamiarem jest ustawienie rafSupported na true lub false na podstawie dostępności funkcji w requestAnimationFrame
można to osiągnąć, ogólnie sprawdzając w następujący sposób:
krótką drogą może być użycie !!
więc jeśli funkcja requestAnimationFrame ma przypisaną funkcję, to parametr requestAnimationFrame będzie fałszywy i jeszcze jeden! byłoby to prawdą
jeśli requestAnimationFrame został przyjęty jako niezdefiniowany, to! requestAnimationFrame byłoby prawdziwe i jeszcze jedno! byłoby to fałszywe
źródło
Niektóre operatory w JavaScript wykonują niejawne konwersje typów, a czasem są używane do konwersji typów.
Jednoargumentowy
!
operator przekształca swój operand na wartość logiczną i neguje go.Ten fakt prowadzi do następującego idiomu, który można zobaczyć w kodzie źródłowym:
źródło
Użyj logicznego operatora nie dwa razy,
co oznacza! Prawda = fałsz
i !! prawda = prawda
źródło
Zwraca wartość logiczną zmiennej.
Zamiast tego
Boolean
można użyć klasy.(proszę przeczytać opisy kodów)
Mianowicie
Boolean(X) = !!X
w użyciu.Sprawdź fragment kodu poniżej ↓
źródło