El if
y while
Aussagen und die ?
Operator verwenden Wahrheitswerte, um zu bestimmen, welcher Zweig des Codes ausgeführt werden soll. So sind beispielsweise die Zahlen Null und NaN sowie die leere Zeichenkette falsch, während andere Zahlen und Zeichenketten wahr sind. Objekte sind wahr, aber der undefinierte Wert und null
sind beide falsch.
Der doppelte Negationsoperator !!
errechnet den Wahrheitswert eines Wertes. Es sind eigentlich zwei Operatoren, wobei !!x
bedeutet !(!x)
und verhält sich wie folgt:
- Wenn
x
ist ein falscher Wert, !x
es true
y !!x
es false
.
- Wenn
x
ist ein echter Wert, !x
es false
y !!x
es true
.
Bei Verwendung auf der obersten Ebene eines booleschen Kontexts ( if
, while
, oder ?
), die !!
Operator ist verhaltenstechnisch ein No-op. Zum Beispiel, if (x)
y if (!!x)
das Gleiche bedeuten.
Praktische Anwendungen
Es hat jedoch mehrere praktische Anwendungen.
Eine Möglichkeit besteht darin, ein Objekt verlustbehaftet auf seinen wahren Wert zu komprimieren, so dass Ihr Code keinen Verweis auf ein großes Objekt enthält und dieses am Leben erhält. Zuweisung von !!some_big_object
in eine Variable anstelle von some_big_object
lässt es für den Garbage Collector los. Dies ist nützlich für Fälle, die entweder ein Objekt oder einen falschen Wert erzeugen, wie z.B. null
oder den undefinierten Wert, wie z. B. die Erkennung von Browser-Features.
Eine weitere Verwendung, die ich in einem Antwort über C's entsprechende !!
operador ist mit "lint"-Werkzeugen, die nach häufigen Tippfehlern suchen und Diagnosen ausgeben. Sowohl in C als auch in JavaScript führen beispielsweise einige häufige Tippfehler bei booleschen Operationen zu anderen Verhaltensweisen, deren Ausgabe nicht ganz so boolesch ist:
if (a = b)
ist eine Zuweisung, gefolgt von der Verwendung des Wahrheitswertes von b
; if (a == b)
ist ein Gleichheitsvergleich.
if (a & b)
ist ein bitweises UND; if (a && b)
ist ein logisches UND. 2 & 5
es 0
(ein falscher Wert); 2 && 5
wahr ist.
El !!
Operator versichert dem Lint-Tool, dass das, was Sie geschrieben haben, das ist, was Sie gemeint haben: Führe diese Operation durch und nimm dann den Wahrheitswert des Ergebnisses.
Eine dritte Verwendung ist die Erzeugung von logischem XOR und logischem XNOR. Sowohl in C als auch in JavaScript, a && b
führt eine logische UND-Verknüpfung durch (wahr, wenn beide Seiten wahr sind), und a & b
führt ein bitweises AND durch. a || b
führt eine logische ODER-Verknüpfung durch (wahr, wenn mindestens eine der beiden Antworten wahr ist), und a | b
führt ein bitweises ODER durch. Es gibt ein bitweises XOR (exklusives OR) als a ^ b
, aber es gibt keinen eingebauten Operator für logisches XOR (wahr, wenn genau eine Seite wahr ist). Sie könnten zum Beispiel dem Benutzer erlauben, Text in genau eines von zwei Feldern einzugeben. Sie können jedes Feld in einen Wahrheitswert umwandeln und vergleichen: !!x !== !!y
.
1428 Stimmen
Erinnern Sie sich daran mit "bang, bang, du bist boolesch"
126 Stimmen
Nur um das festzuhalten: Tun Sie nicht, was dort steht. Machen Sie
if(vertical !== undefined) this.vertical = Boolean(vertical);
- es ist viel sauberer und klarer, was vor sich geht, erfordert keine unnötige Zuweisung, ist ganz Standard und ist genauso schnell (auf aktuellem FF und Chrome) jsperf.com/boolean-conversion-speed .0 Stimmen
"Jeder anständige Programmierer sollte wissen, was vor sich geht..." - manchmal hilft es dem Compiler, besseren Code in kompilierten Sprachen zu erzeugen. Ich weiß, dass es früher von Microsoft bei der Verwendung von C-Code empfohlen wurde, weil es den besten Code erzeugt. (Wahrscheinlich wird es immer noch empfohlen, aber ich kann die Referenz im Moment nicht finden).
127 Stimmen
!! ist kein Operator. Es ist nur der Operator ! zweimal.
85 Stimmen
@schabluk, fürs Protokoll, Reihenfolge der Operationen ist der Grund
!!5/0
produziertInfinity
statttrue
wie sie vonBoolean(5/0)
.!!5/0
ist gleichbedeutend mit(!!5)/0
-auch bekannt alstrue/0
-- aufgrund der!
Operator, der einen höheren Vorrang hat als der/
Betreiber. Wenn Sie die Booleschen Operatoren5/0
Wenn Sie einen Doppelknall verwenden, müssen Sie!!(5/0)
.0 Stimmen
Einfach ausgedrückt: !!vertical gibt Ihnen einen booleschen Wert, der angibt, ob "vertikal" definiert oder nicht-falsch ist.
2 Stimmen
Was bedeutet !!(x) in C (vor allem im Linux-Kernel)?
0 Stimmen
Nur fürs Protokoll: Boolean(5/0) ist nicht dasselbe wie !!5/0 - schabluk 12. Februar '15 um 9:45 Ja, weil Sie die zweite Anweisung ohne die Klammern verwenden. In jedem anderen Fall sind sie dasselbe Boolean(5/0) dasselbe wie !!(5/0)
2 Stimmen
Erklären Sie einfach:
!!value === Boolean(value)
52 Stimmen
@Gus Nur damit du es weißt: Ich habe deinen Kommentar schon 2012 gelesen. In den 7 Jahren, die seitdem vergangen sind, habe ich im Geiste immer gesagt: "Peng, peng, du bist ein Boolescher!", wenn ich einen Booleschen Wert invertiert habe, und ich habe mich immer daran erinnert, wie das geht. Ich habe heute beschlossen, Ihren Kommentar nachzuschlagen und Ihnen Bescheid zu geben :-)
11 Stimmen
@ZacharySchuessler thx, ich freue mich, dass es so vielen gefällt, und ich habe sogar gesehen, dass es jetzt in Tutorial-Seiten und so zitiert (und gutgeschrieben) wird, was großartig ist :) ich hätte mir nie träumen lassen, dass ich eine so beliebte Eselsbrücke prägen würde.
0 Stimmen
Phil H BTW in javascript sollte man eine Variable nicht mit dem ternären Operator (!== oder ===) prüfen. Verwenden Sie einfach (Variable == null). Die Überprüfung einer Variablen mit dem ternären Operator bedeutet, dass Sie sowohl undefined als auch null überprüfen müssen. In javascript (OP-Abfrage) undefined !== null
0 Stimmen
Wenn this.vertical == "good" und vertical == "other", dann würde this.vertical in einen booleschen Wert true!! geändert werden. Das ist nicht deterministisch. Dieser Code ändert einfach den Variablentyp, was zu unerwarteten Ergebnissen führen wird
0 Stimmen
Ich betrachte es als eine Art "Wahrheits-Check".
0 Stimmen
Wird die Variable einfach gezwungen, einen booleschen Wert zu haben. Dies ist nützlich für Assertions und Prüfungen.