4186 Stimmen

Was ist der !! (nicht nicht) Operator in JavaScript?

Ich habe einen Code gesehen, der einen mir unbekannten Operator in Form von zwei Ausrufezeichen zu verwenden scheint, etwa so: !! . Kann mir bitte jemand sagen, was dieser Operator macht?

Der Kontext, in dem ich dies sah, war,

this.vertical = vertical !== undefined ? !!vertical : this.vertical;

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).

1voto

nguyenhoavuong Punkte 11

!! ist kein Operator, es ist nur der Operator ! zweimal

Aber mit Javascript, gelten !! für konvertieren Objekt zu booleschen ist Redundanz und langwierig in den meisten Fall, weil:

Jedes Objekt, dessen Wert nicht undefiniert oder null ist, einschließlich eines Boolesches Objekt, dessen Wert falsch ist, wird als wahr bewertet, wenn es an eine bedingte Anweisung

Ex: if ({}) { console.log("{} is true")} // logs: "{} is true"

0 Stimmen

"...ein boolesches Objekt, dessen Wert falsch ist, wird als wahr ausgewertet, wenn..." Hm? Ich meine, JavaScript verdient Hass für all seine Dummheit, aber ich glaube nicht, dass es wirklich so dumm ist, oder?

0 Stimmen

@swpalmer jsfiddle.net/rsgqb5zp Schauen Sie zu und staunen Sie! Weniger leicht verständlich ist die Unterscheidung zwischen booleschen (big b) Objekten, die Referenztypen sind, und booleschen (small b), die Werttypen sind. Die if-Bedingung prüft Referenztypen, um festzustellen, ob sie nicht null oder undefiniert sind.

0voto

Manchmal ist es notwendig, zu prüfen, ob wir einen Wert in der Funktion haben oder nicht, und der Betrag selbst ist für uns nicht wichtig, sondern ob er wichtig ist oder nicht. Zum Beispiel wollen wir prüfen, ob der Benutzer einen Hauptschulabschluss hat oder nicht, und wir haben eine Funktion wie diese:

hasMajor(){return this.major}//it return "(users major is)Science" 

aber die Antwort ist nicht wichtig für uns, wir wollen nur prüfen, ob es einen Major hat oder nicht, und wir brauchen einen booleschen Wert (wahr oder falsch), wie wir ihn bekommen:

einfach so:

hasMajor(){ return !(!this.major)}

oder als dasselbe

hasMajor(){return !!this.major)}

wenn this.major einen Wert hat, dann !this.major false zurückgeben, aber da der Wert Exits hat und wir true zurückgeben müssen, verwenden wir ! zweimal, um die richtige Antwort zurückzugeben !(!this.major)

0voto

Mile Mijatović Punkte 2467
const foo = 'bar';
console.log(!!foo); // Boolean: true

! negiert (invertiert) einen Wert UND liefert/produziert immer einen booleschen Wert. So würde !'bar' falsch ergeben (weil 'bar' wahrheitsgemäß ist => negiert + boolesch = falsch). Mit dem zusätzlichen Operator ! wird der Wert wieder negiert, so dass false zu true wird.

-3voto

rob_james Punkte 1212

Dies ist ein wirklich praktischer Weg, um auf undefiniert, "undefiniert", null, "null", "" zu prüfen.

if (!!var1 && !!var2 && !!var3 && !!var4 ){
   //... some code here
}

0 Stimmen

Warum? Ich muss immer noch wissen, dass die Variablen 1 bis 4 Werte enthalten.

8 Stimmen

Weil die && Operatoren bereits in boolesche Operatoren "umwandeln".

0 Stimmen

Hm - cool! Zum Wohl. Fürs Protokoll: Ich wollte damit sagen, dass es gut ist, viele Werte zu überprüfen. Können Sie sich das ohne boolesche Konvertierung vorstellen?! Verrückt! Wie auch immer, das ist gut zu wissen. Passiert das Gleiche mit || ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X