Ich habe einen Code gesehen, der einen Operator zu verwenden scheint, den ich nicht kenne, und zwar in Form von zwei Ausrufezeichen : !!
. Kann mir bitte jemand sagen, was dieser Operator macht?
Der Kontext, in dem ich das sah, war:
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
javascript
operators
Hexagon-Theorie
quelle
quelle
if(vertical !== undefined) this.vertical = Boolean(vertical);
- es ist viel sauberer und klarer, was vor sich geht, erfordert keine unnötige Zuweisung, ist Standard und genauso schnell (bei aktuellem FF und Chrome) jsperf.com/boolean-conversion-speed .Boolean(5/0)
ist nicht das gleiche wie!!5/0
!!5/0
derInfinity
eher produziert alstrue
, wie von produziertBoolean(5/0)
.!!5/0
ist gleichbedeutend mit(!!5)/0
- akatrue/0
-, da der!
Operator eine höhere Priorität als der/
Operator hat. Wenn Sie5/0
mit einem Doppelknall booleanisieren möchten , müssen Sie verwenden!!(5/0)
.Antworten:
Konvertiert
Object
inboolean
. Wenn es Falsey (zB0
,null
,undefined
, etc.), wird es seinfalse
, andernfallstrue
.Ist
!!
also kein Operator, es ist nur der!
Operator zweimal.Beispiel aus der realen Welt "IE-Version testen":
Wenn Sie ⇒
Aber wenn Sie ⇒
quelle
Es ist eine schrecklich dunkle Art, eine Typkonvertierung durchzuführen.
!
ist NICHT . So!true
istfalse
und!false
isttrue
.!0
isttrue
und!1
istfalse
.Sie konvertieren also einen Wert in einen Booleschen Wert, invertieren ihn dann und invertieren ihn erneut.
quelle
userId ? true : false
macht deutlicher, dass eine Konvertierung stattfindet, und behandelt den Fall, in dem der Wert von userId möglicherweise explizit festgelegt wurdeundefined
!!var
inBoolean(var)
... und!!
ist schneller (weniger zu verarbeitende Anweisungen) und kürzer als die Alternativen.userId != 0
gilt fürnull
,NaN
undundefined
, aber falsch fürfalse
. Wenn Sie genau dieses Verhalten wünschen, sollten Sie dies wahrscheinlich explizit angeben. Aber selbst wenn es funktionierte genau das gleiche wie!!userId
, es ist nicht klar , ob Sie wollen diese Werte hier falsch zu kommen, oder ob Sie nur Regeln Javascript die Typumwandlung zu prüfen , ist fehlgeschlagen.!!expr
Gibt einen booleschen Wert (true
oderfalse
) zurück, abhängig von der Wahrhaftigkeit des Ausdrucks. Es ist sinnvoller, wenn es für nicht-boolesche Typen verwendet wird. Betrachten Sie diese Beispiele, insbesondere das dritte Beispiel und weiter:quelle
!!new Boolean(false) // true
!!Boolean(false) // false
new Boolean(false)
ist ein Objekt und ein Objekt ist wahr, auch wenn es einen falschen Wert enthält!String
,Number
,Date
, usw.) auch als Funktionen aufrufbar sein sollen, doch in diesem Fall ist das Ergebnis anders aus !new Boolean(false)
kehrt ein ,object
währendBoolean(false)
die Renditen primitivfalse
. Hoffe das macht Sinn.Tee kochen:
!!
ist kein Operator. Es ist die doppelte Verwendung von!
- was der logische "Nicht" -Operator ist.In der Theorie:
!
bestimmt die "Wahrheit" dessen, was ein Wert nicht ist:Die Wahrheit ist, dass dies
false
nicht der Fall isttrue
(deshalb!false
ergibt sichtrue
)Die Wahrheit ist, dass dies
true
nicht der Fall istfalse
(deshalb!true
ergibt sichfalse
)!!
bestimmt die „Wahrheit“ von dem, was ein Wert ist nicht nicht:Die Wahrheit ist, dass dies
true
nicht der Fall isttrue
(deshalb!!true
ergibt sichtrue
)Die Wahrheit ist, dass dies
false
nicht der Fall istfalse
(deshalb!!false
ergibt sichfalse
)Was wir im Vergleich feststellen wollen, ist die "Wahrheit" über den Wert einer Referenz, nicht den Wert der Referenz selbst. Es gibt einen Anwendungsfall, in dem wir die Wahrheit über einen Wert wissen möchten, selbst wenn wir erwarten, dass der Wert
false
(oder Falsey) ist, oder wenn wir erwarten, dass der Wert nicht typisiert istboolean
.In der Praxis:
Stellen Sie sich eine übersichtliche Funktion vor, die die Funktionsfunktionalität (und in diesem Fall die Plattformkompatibilität) durch dynamische Typisierung (auch als "Ententypisierung" bezeichnet) erkennt . Wir möchten eine Funktion schreiben, die zurückgibt,
true
wenn der Browser eines Benutzers das HTML5-<audio>
Element unterstützt, aber wir möchten nicht, dass die Funktion einen Fehler<audio>
auslöst, wenn sie nicht definiert ist. und wir wollen nicht verwendentry ... catch
, um mögliche Fehler zu behandeln (weil sie grob sind); Außerdem möchten wir keine Prüfung innerhalb der Funktion verwenden, die nicht immer die Wahrheit über die Funktion preisgibt (z. B.document.createElement('audio')
wird immer noch ein Element namens aufgerufen,<audio>
auch wenn HTML5<audio>
nicht unterstützt wird).Hier sind die drei Ansätze:
Jede Funktion akzeptiert ein Argument für a
<tag>
und a,attribute
nach dem gesucht werden soll, gibt jedoch unterschiedliche Werte zurück, je nachdem, was die Vergleiche bestimmen.Aber warte, da ist noch mehr!
Einige von euch wahrscheinlich in diesem speziellen Beispiel bemerkt , dass man einfach für eine Eigenschaft überprüfen könnten , die leicht mit leistungsfähigere Mittel zur Überprüfung , ob das betreffende Objekt hat eine Eigenschaft. Es gibt zwei Möglichkeiten, dies zu tun:
Wir schweifen ab ...
So selten diese Situationen auch sein mögen, es kann einige Szenarien geben, in denen das prägnanteste, performanteste und daher am meisten bevorzugte Mittel zum Abrufen
true
von einem nicht-booleschen, möglicherweise undefinierten Wert tatsächlich die Verwendung ist!!
. Hoffentlich klärt das lächerlich auf.quelle
if()
Anweisung den Ausdruck bereits in einen Booleschen Wert umwandelt, ist das explizite Umwandeln des Rückgabewerts einer Testfunktion in einen Booleschen Wert überflüssig - da "Wahrhaftigkeit" === wahr ist, soweit eineif()
Anweisung dies zulässt . Oder fehlt mir ein Szenario, in dem Sie einen wahrheitsgemäßen Ausdruck benötigen, um tatsächlich boolesch zu seintrue
?if()
Anweisungen wandeln Boolesche Werte gegen Falsey-Werte um, sagen jedoch, dass Sie tatsächlich ein Boolesches Flag für ein Objekt setzen möchten - es wird nicht wie eineif()
Anweisung gewirkt. Zum Beispielobject.hasTheThing = !!castTheReturnValToBoolNoMatterWhat()
würde entwedertrue
oderfalse
anstelle des realen Rückgabewerts gesetzt. Ein anderes Beispiel ist vielleicht, dass alle Administratorenid
von0
und Nicht-Administratoren von id1
oder höher sind. Um herauszufinden,true
ob jemand kein Administrator ist, können Sie dies tunperson.isNotAdmin = !!admin.id
. Nur wenige Anwendungsfälle, aber es ist prägnant, wenn es welche gibt.!!
konvertiert den Wert rechts davon in seinen äquivalenten booleschen Wert. (Denken Sie an die Art des "Typ-Castings" des armen Mannes). Seine Absicht ist in der Regel an die Leser zu vermitteln , dass der Code kümmert sich nicht darum , was Wert in der Variablen ist, aber was es ist „Wahrheit“ Wert ist.quelle
!
kippt den Wert immer noch nach rechts. Bei einem Booleschen!
Wert negiert der am weitesten rechts stehende den Wert, während der am weitesten links stehende Wert!
ihn erneut negiert. Der Nettoeffekt ist, dass es keine Änderung gibt, aber die meisten Engines generieren Op-Codes für die doppelte Negation.if(0){...
Javascript mache, weiß ich bereits, dass dies falsch ist. Warum ist es besser zu sagenif(!!0){...
?!!foo
Wendet den unären nicht-Operator zweimal an und wird zum Umwandeln in einen booleschen Typ verwendet, ähnlich wie bei der Verwendung von unary plus+foo
zum Umwandeln in eine Zahl und zum Verketten einer leeren Zeichenfolge''+foo
zum Umwandeln in einen String.Anstelle dieser Hacks können Sie auch die Konstruktorfunktionen verwenden, die den primitiven Typen entsprechen ( ohne verwenden
new
), um Werte explizit umzuwandeln, d. H.quelle
new
- wie in meiner Antwort ausdrücklich erwähntx="0"
tun Sie asuming do do: Diesx=!!+x; //false
ist dasselbe wieBoolean(Number(x))
Number (oder + x) konvertiert die Zeichenfolge "0" in 0, die DOED in false auswertet, und dann Boolean (!! x) wandelt es direkt in einen Booleschen Wert um. Kinderleicht!!!+x
vs wählenx !== "0"
?So viele Antworten machen die halbe Arbeit. Ja,
!!X
könnte als "die Wahrhaftigkeit von X [dargestellt als Boolescher Wert]" gelesen werden. Aber!!
ist praktisch nicht so wichtig, um herauszufinden, ob eine einzelne Variable wahr oder falsch ist (oder auch wenn viele Variablen wahr sind).!!myVar === true
ist das gleiche wie gerademyVar
. Der Vergleich!!X
mit einem "echten" Booleschen Wert ist nicht wirklich nützlich.Was Sie damit gewinnen,
!!
ist die Fähigkeit, die Richtigkeit mehrerer Variablen gegeneinander zu prüfen auf wiederholbare, standardisierte (und JSLint-freundliche) Weise .Einfach gießen :(
Das ist...
0 === false
istfalse
.!!0 === false
isttrue
.Das obige ist nicht so nützlich.
if (!0)
gibt Ihnen die gleichen Ergebnisse wieif (!!0 === false)
. Ich kann mir keinen guten Fall vorstellen, um eine Variable in einen Booleschen Wert umzuwandeln und dann mit einem "wahren" Booleschen Wert zu vergleichen.Siehe "== und! =" Aus den Anweisungen von JSLint (Hinweis: Crockford verschiebt seine Website ein wenig; dieser Link kann irgendwann sterben) für ein wenig warum:
Beachten Sie, dass es einige nicht intuitive Fälle gibt, in denen ein Boolescher Wert in eine Zahl umgewandelt wird (
true
in1
undfalse
nach0
), wenn ein Boolescher Wert mit einer Zahl verglichen wird. In diesem Fall!!
könnte geistig nützlich sein. Obwohl wieder, diese Fälle , in denen Sie ein nicht-boolean zu einem harten typisierte boolean sind zu vergleichen, das ist, imo, ein schwerwiegender Fehler.if (-1)
ist immer noch der Weg hierher.Und je nach Motor wird es noch verrückter. WScript zum Beispiel gewinnt den Preis.
Aufgrund eines historischen Windows-Jives wird -1 in einem Meldungsfeld ausgegeben! Versuchen Sie es in einer cmd.exe-Eingabeaufforderung und sehen Sie! Aber
WScript.echo(-1 == test())
gibt Ihnen immer noch 0 oder WScriptfalse
. Schau weg. Es ist schrecklich.Wahrhaftigkeit vergleichen :)
Aber was ist, wenn ich zwei Werte habe, die ich auf gleiche Wahrheit / Falschheit prüfen muss?
Stellen Sie sich vor, wir hätten
myVar1 = 0;
undmyVar2 = undefined;
.myVar1 === myVar2
ist0 === undefined
und ist offensichtlich falsch.!!myVar1 === !!myVar2
ist!!0 === !!undefined
und ist wahr! Gleiche Wahrhaftigkeit! (In diesem Fall haben beide "eine Wahrheit der Falschheit".)Der einzige Ort, an dem Sie wirklich "boolesche Cast-Variablen" verwenden müssten, wäre, wenn Sie eine Situation hätten, in der Sie prüfen, ob beide Variablen die gleiche Wahrhaftigkeit haben, oder? Das heißt, verwenden Sie , wenn Sie sehen müssen, ob zwei Vars beide wahr oder beide falsch (oder nicht) sind, dh von gleicher (oder nicht) Wahrhaftigkeit .
!!
Ich kann mir keinen großartigen, nicht erfundenen Anwendungsfall für diese Nebenhand vorstellen. Vielleicht haben Sie Felder in einem Formular "verknüpft"?
Wenn Sie also eine Wahrheit für beide oder eine Falschheit für den Namen und das Alter des Ehepartners haben, können Sie fortfahren. Andernfalls haben Sie nur ein Feld mit einem Wert (oder einer sehr früh arrangierten Ehe) und müssen einen zusätzlichen Fehler in Ihrer
errorObjects
Sammlung erstellen .BEARBEITEN 24. Oktober 2017, 6. Februar 19:
Bibliotheken von Drittanbietern, die explizite boolesche Werte erwarten
Hier ist ein interessanter Fall ...
!!
kann nützlich sein, wenn Bibliotheken von Drittanbietern explizite boolesche Werte erwarten.Zum Beispiel hat False in JSX (React) eine besondere Bedeutung , die nicht durch einfache Falschheit ausgelöst wird. Wenn Sie versucht haben, in JSX Folgendes zurückzugeben, erwarten Sie ein int in
messageCount
...{messageCount && <div>You have messages!</div>}
... Sie könnten überrascht sein,
0
wenn React a rendert, wenn Sie keine Nachrichten haben. Sie müssen explizit false zurückgeben, damit JSX nicht gerendert wird. Die obige Anweisung gibt zurück0
, die JSX gerne wiedergibt, wie es sollte. Es kann nicht sagen, dass Sie nicht hattenCount: {messageCount && <div>Get your count to zero!</div>}
(oder etwas weniger erfunden).Ein Update beinhaltet die bangbang, die nötigt
0
in!!0
, das istfalse
:{!!messageCount && <div>You have messages!</div>}
In den JSX-Dokumenten wird empfohlen, expliziter zu sein, selbstkommentierenden Code zu schreiben und einen Vergleich zu verwenden, um einen Booleschen Wert zu erzwingen.
{messageCount > 0 && <div>You have messages!</div>}
Ich fühle mich wohler mit Falschheit selbst mit einem ternären -
{messageCount ? <div>You have messages!</div> : false}
Gleiches Angebot in Typescript: Wenn Sie eine Funktion haben, die einen Booleschen Wert zurückgibt (oder einer booleschen Variablen einen Wert zuweisen), können Sie [normalerweise] keinen Booleschen-y-Wert zurückgeben / zuweisen. Es muss ein stark typisierter Boolescher Wert sein. Dies bedeutet, dass iff
myObject
, wenn es stark typisiert ist ,return !myObject;
für eine Funktion funktioniert, die einen Booleschen Wert zurückgibt, dies jedochreturn myObject;
nicht tut. Sie müssenreturn !!myObject
den Erwartungen von Typescript entsprechen.Beachten Sie, dass dies JSX- und Typescript-Konventionen sind, die JavaScript nicht eigen sind .
Aber wenn Sie seltsame
0
s in Ihrem gerenderten JSX sehen, denken Sie an lockeres Falsy-Management.quelle
if (!!window.Worker)
true
"extern" funktionieren in einem genau gleichif
. Ich versuche es weiter, aber ich kann mir keinen Grund vorstellen, die Wahrhaftigkeit lieber auf einen booleschen Wert außerhalb des oben genannten verschlungenen Falles "Wahrheiten vergleichen" zu übertragen, mit Ausnahme der Lesbarkeit, wenn Sie den Wert später wiederverwenden, wie imq
Beispiel der Bibliothek . Aber selbst dann ist es eine Abkürzung mit Informationsverlust, und ich würde behaupten, dass Sie jedes Mal besser dran sind, die Wahrhaftigkeit zu bewerten.Es ist nur der logische NOT-Operator, zweimal - er wird verwendet, um etwas in Boolesche Werte umzuwandeln, z.
quelle
Es konvertiert das Suffix in einen Booleschen Wert.
quelle
Es ist eine doppelte
not
Operation. Der erste!
konvertiert den Wert in einen Booleschen Wert und invertiert seinen logischen Wert. Der zweite!
invertiert den logischen Wert zurück.quelle
Es scheint, dass der
!!
Operator zu einer doppelten Negation führt.quelle
Es simuliert das Verhalten der
Boolean()
Gießfunktion. Der ersteNOT
gibt einen booleschen Wert zurück, unabhängig davon, welcher Operand angegeben ist. Der zweiteNOT
negiert diesenBoolean
Wert und gibt so dentrue
Booleschen Wert einer Variablen an. Das Endergebnis entspricht der Verwendung derBoolean()
Funktion für einen Wert.quelle
! ist "boolean not", was im Wesentlichen den Wert von "enable" gegenüber seinem booleschen Gegenteil typisiert. Der Zweite ! dreht diesen Wert um. Bedeutet
!!enable
also "nicht nicht aktivieren" und gibt Ihnen den Wertenable
eines Booleschen Werts .quelle
Erwähnenswert ist meiner Meinung nach, dass eine Bedingung in Kombination mit logischem UND / ODER keinen booleschen Wert zurückgibt, sondern den letzten Erfolg oder den ersten Fehler bei && und den ersten Erfolg oder den letzten Fehler bei || der Zustandskette.
Um die Bedingung in ein echtes boolesches Literal umzuwandeln, können wir die doppelte Negation verwenden:
quelle
!!
Es verwendet dieNOT
Operation zweimal zusammen,!
konvertiert den Wert in aboolean
und kehrt ihn um. Hier ist ein einfaches Beispiel, um zu sehen, wie es!!
funktioniert:Zuerst haben Sie den Ort, den Sie haben:
Dann
!0
wird es in einen Booleschen Wert konvertiert und in ausgewertettrue
, da 0 istfalsy
. Sie erhalten also den umgekehrten Wert und werden in einen Booleschen Wert konvertiert, sodass er in ausgewertet wirdtrue
.aber wir wollen nicht die umgekehrte boolesche Version des Wertes, also können wir sie wieder umkehren, um unser Ergebnis zu erhalten! Deshalb verwenden wir einen anderen
!
.!!
Stellen Sie im Grunde sicher, dass der Wert, den wir erhalten, boolesch ist, nicht falsch, wahr oder string etc ...Es ist also so, als würde man eine
Boolean
Funktion in Javascript verwenden, aber eine einfache und kürzere Möglichkeit, einen Wert in einen Booleschen Wert umzuwandeln:quelle
Das
!!
Konstrukt ist eine einfache Möglichkeit, einen JavaScript-Ausdruck in ein boolesches Äquivalent umzuwandeln.Zum Beispiel:
!!"he shot me down" === true
und!!0 === false
.quelle
0 === false
das falsch und!!0 === false
wahr ist.Es ist kein einzelner Operator, es sind zwei. Es entspricht dem Folgenden und ist eine schnelle Möglichkeit, einen Wert in einen Booleschen Wert umzuwandeln.
quelle
Ich vermute, dies ist ein Überbleibsel aus C ++, bei dem die Leute das überschreiben! Operator, aber nicht der Bool-Operator.
Um in diesem Fall eine negative (oder positive) Antwort zu erhalten, müssten Sie zuerst die! Operator, um einen Booleschen Wert zu erhalten, aber wenn Sie den positiven Fall überprüfen möchten, würde verwenden !!.
quelle
Der
if
undwhile
Aussagen und die?
Betreiber Werte Verwendung Wahrheit zu bestimmen , welchen Zweig des Code auszuführen. Zum Beispiel sind Null- und NaN-Zahlen und die leere Zeichenfolge falsch, aber andere Zahlen und Zeichenfolgen sind wahr. Objekte sind wahr, aber der undefinierte Wert undnull
beide sind falsch.Der Doppel-Negationsoperator
!!
berechnet den Wahrheitswert eines Wertes. Es sind eigentlich zwei Operatoren, wo!!x
bedeutet!(!x)
und verhält sich wie folgt:x
ein falscher Wert!x
isttrue
, ist und!!x
istfalse
.x
ist ein wahrer Wert,!x
istfalse
und!!x
isttrue
.Wenn auf der obersten Ebene eines Booleschen Kontext verwendet (
if
,while
oder?
), die!!
ist Operator behaviorally ein no-op. Zum Beispielif (x)
undif (!!x)
bedeuten das Gleiche.Praktische Anwendungen
Es hat jedoch mehrere praktische Anwendungen.
Eine Verwendung besteht darin, ein Objekt verlustbehaftet auf seinen Wahrheitswert zu komprimieren, sodass Ihr Code keinen Verweis auf ein großes Objekt enthält und es am Leben erhält. Wenn Sie
!!some_big_object
einer Variablen zuweisen , anstattsome_big_object
sie für den Garbage Collector loszulassen. Dies ist nützlich für Fälle, in denen entweder ein Objekt oder ein falscher Wert wienull
der undefinierte Wert wie die Erkennung von Browserfunktionen erzeugt wird.Eine andere Verwendung, die ich in einer Antwort über den entsprechenden
!!
Operator von C erwähnt habe , sind "Flusen" -Tools, die nach allgemeinen Tippfehlern und Druckdiagnosen suchen. Beispielsweise führen sowohl in C als auch in JavaScript einige häufig vorkommende Tippfehler für Boolesche Operationen zu anderen Verhaltensweisen, deren Ausgabe nicht ganz so Boolesch ist:if (a = b)
ist die Zuordnung gefolgt von der Verwendung des Wahrheitswertes vonb
;if (a == b)
ist ein Gleichheitsvergleich.if (a & b)
ist ein bitweises UND;if (a && b)
ist ein logisches UND.2 & 5
ist0
(ein falscher Wert);2 && 5
ist wahr.Der
!!
Bediener versichert dem Flusenwerkzeug, dass das, was Sie geschrieben haben, das ist, was Sie gemeint haben: Führen Sie diese Operation aus und nehmen Sie dann den Wahrheitswert des Ergebnisses.Eine dritte Verwendung besteht darin, logisches XOR und logisches XNOR zu erzeugen. Führt sowohl in C als auch in JavaScript
a && b
ein logisches UND aus (wahr, wenn beide Seiten wahr sind) unda & b
ein bitweises UND.a || b
führt ein logisches ODER aus (wahr, wenn mindestens eines wahr ist) unda | b
führt ein bitweises ODER durch. Es gibt ein bitweises XOR (exklusives ODER) alsa ^ b
, aber es gibt keinen eingebauten Operator für logisches XOR (wahr, wenn genau eine Seite wahr ist). Möglicherweise möchten Sie dem Benutzer beispielsweise erlauben, Text in genau eines von zwei Feldern einzugeben. Was Sie tun können, ist, jeden in einen Wahrheitswert umzuwandeln und zu vergleichen :!!x !== !!y
.quelle
Doppelte boolesche Negation. Wird oft verwendet, um zu überprüfen, ob der Wert nicht undefiniert ist.
quelle
Tonnenweise gute Antworten hier, aber wenn Sie so weit gelesen haben, hat mir das geholfen, es zu verstehen. Öffnen Sie die Konsole in Chrome (usw.) und geben Sie Folgendes ein:
Natürlich sind diese alle gleichbedeutend mit bloßem Tippen !! someThing, aber die hinzugefügten Klammern könnten helfen, es verständlicher zu machen.
quelle
!!x
ist eine Abkürzung fürBoolean(x)
Der erste Knall zwingt den js-Motor zum Laufen
Boolean(x)
, hat aber auch den Nebeneffekt, dass der Wert invertiert wird. Der zweite Knall macht also den Nebeneffekt rückgängig.quelle
Es zwingt alle Dinge zum Booleschen.
Zum Beispiel:
quelle
Diese Frage wurde ziemlich gründlich beantwortet, aber ich möchte eine Antwort hinzufügen, von der ich hoffe, dass sie so einfach wie möglich ist und die Bedeutung von !! so einfach zu erfassen wie möglich.
Da Javascript sogenannte "truey" - und "falsey" -Werte hat, gibt es Ausdrücke, die bei Auswertung in anderen Ausdrücken zu einer wahren oder falschen Bedingung führen, obwohl der untersuchte Wert oder Ausdruck nicht tatsächlich
true
oder falsch istfalse
.Zum Beispiel:
Wenn dieses Element tatsächlich vorhanden ist, wird der Ausdruck als wahr ausgewertet und der Codeblock ausgeführt.
Jedoch:
... führt NICHT zu einer echten Bedingung, und der Codeblock wird nicht ausgeführt, selbst wenn das Element vorhanden ist.
Warum? Weil
document.getElementById()
es sich um einen "wahrheitsgemäßen" Ausdruck handelt, der in dieserif()
Aussage als wahr ausgewertet wird , aber kein tatsächlicher boolescher Wert von isttrue
.Das doppelte "nicht" ist in diesem Fall ganz einfach. Es sind einfach zwei
not
Sekunden hintereinander.Der erste "invertiert" einfach den Wahrheits- oder False-Wert, was zu einem tatsächlichen Booleschen Typ führt, und der zweite "invertiert" ihn wieder in seinen ursprünglichen Zustand, aber jetzt in einen tatsächlichen Booleschen Wert. Auf diese Weise haben Sie Konsistenz:
und
wird BEIDE wie erwartet true zurückgeben.
quelle
Ich wollte das nur hinzufügen
ist das gleiche wie
Dies kann jedoch ein Problem sein, wenn etwas undefiniert ist.
Der Trick dabei ist, dass die Kette von
&&
s den ersten gefundenen Falsey-Wert zurückgibt - und dieser kann einer if-Anweisung usw. zugeführt werden. Wenn also b.foo undefiniert ist, gibt sie undefiniert zurück und überspringt denb.foo.bar
Anweisung, und wir erhalten no Error.Die obigen Werte geben undefiniert zurück, aber wenn Sie eine leere Zeichenfolge haben, false, null, 0, undefined, werden diese Werte zurückgegeben und sobald wir sie in der Kette finden -
[]
und{}
beide sind "wahr" und wir werden den sogenannten " && Kette "zum nächsten Wert rechts.PS Eine andere Möglichkeit, dasselbe zu tun, besteht darin
(b || {}).foo
, dass wenn b undefiniert istb || {}
, dies der Fall{}
ist und Sie auf einen Wert in einem leeren Objekt zugreifen (kein Fehler), anstatt zu versuchen, auf einen Wert innerhalb von "undefiniert" zuzugreifen (verursacht einen Fehler) ). Also(b || {}).foo
ist das gleiche wieb && b.foo
und((b || {}).foo || {}).bar
ist das gleiche wieb && b.foo && b.foo.bar
.quelle
({}).anything
wird es gebenundefined
Nachdem ich all diese großartigen Antworten gesehen habe, möchte ich einen weiteren Grund für die Verwendung hinzufügen
!!
. Derzeit arbeite ich in Angular 2-4 (TypeScript) und möchte einen Booleschen Wert zurückgeben,false
wenn mein Benutzer nicht authentifiziert ist. Wenn er nicht authentifiziert ist, wäre die Token-Zeichenfolgenull
oder""
. Ich kann dies mit dem nächsten Codeblock tun:quelle
Hier ist ein Stück Code aus eckigen js
Sie beabsichtigen, rafSupported basierend auf der Verfügbarkeit der Funktion in requestAnimationFrame auf true oder false zu setzen
Dies kann erreicht werden, indem im Allgemeinen auf folgende Weise geprüft wird:
Der kurze Weg könnte sein !!
Wenn also requestAnimationFrame eine Funktion zugewiesen wurde, wäre! requestAnimationFrame falsch und eine weitere! davon wäre wahr
Wenn requestAnimationFrame als undefiniert eingestuft würde, wäre! requestAnimationFrame wahr und noch einer! davon wäre falsch
quelle
Einige Operatoren in JavaScript führen implizite Typkonvertierungen durch und werden manchmal für die Typkonvertierung verwendet.
Der unäre
!
Operator konvertiert seinen Operanden in einen Booleschen Wert und negiert ihn.Diese Tatsache führt zu der folgenden Redewendung, die Sie in Ihrem Quellcode sehen können:
quelle
Verwenden Sie den logischen Nicht-Operator zweimal
, was bedeutet! True = false
und !! true = true
quelle
Gibt den booleschen Wert einer Variablen zurück.
Stattdessen kann
Boolean
Klasse verwendet werden.(Bitte Codebeschreibungen lesen)
Nämlich
Boolean(X) = !!X
im Einsatz.Bitte überprüfen Sie den Code-Ausschnitt unten ↓
quelle