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

7voto

Wouter Vanherck Punkte 1650

Nachdem ich all diese großartigen Antworten gesehen habe, möchte ich noch einen weiteren Grund für die Verwendung von !! . Currenty Ich arbeite in Angular 2-4 (TypeScript) und ich möchte einen booleschen als zurückgeben false wenn mein Benutzer nicht authentifiziert ist. Wenn er nicht authentifiziert ist, würde die Token-Zeichenkette lauten null o "" . Ich kann dies mit dem folgenden Code-Block tun:

public isAuthenticated(): boolean {
   return !!this.getToken();
}

6voto

Hier ist ein Stück Code aus Angular Js

var requestAnimationFrame = $window.requestAnimationFrame ||
                                $window.webkitRequestAnimationFrame ||
                                $window.mozRequestAnimationFrame;

 var rafSupported = !!requestAnimationFrame;

ihre Absicht ist es, rafSupported auf true oder false zu setzen, je nach Verfügbarkeit der Funktion in requestAnimationFrame

Dies kann im Allgemeinen auf folgende Weise erreicht werden:

if(typeof  requestAnimationFrame === 'function')
rafSupported =true;
else
rafSupported =false;

der kürzeste Weg wäre die Verwendung von !!

rafSupported = !!requestAnimationFrame ;

wenn also requestAnimationFrame eine Funktion zugewiesen wurde dann !requestAnimationFrame wäre false und ein weiteres ! davon wäre true

wenn requestAnimationFrame als undefiniert eingestuft wurde, dann !requestAnimationFrame wäre true und ein weiteres ! davon wäre false

6voto

efkan Punkte 12166

Gibt den booleschen Wert einer Variablen zurück.

Stattdessen, Boolean Klasse verwendet werden kann.

(bitte lesen Sie die Codebeschreibungen)

var X = "test"; // X value is "test" as a String value
var booleanX = !!X // booleanX is `true` as a Boolean value beacuse non-empty strings evaluates as `true` in boolean
var whatIsXValueInBoolean = Boolean(X) // whatIsXValueInBoolean is `true` again
console.log(Boolean(X) === !!X) // writes `true`

Nämlich, Boolean(X) = !!X im Einsatz.

Bitte prüfen Sie das folgende Code-Snippet

let a = 0
console.log("a: ", a) // writes a value in its kind
console.log("!a: ", !a) // writes '0 is NOT true in boolean' value as boolean - So that's true.In boolean 0 means false and 1 means true.
console.log("!!a: ", !!a) // writes 0 value in boolean. 0 means false.
console.log("Boolean(a): ", Boolean(a)) // equals to `!!a`
console.log("\n") // newline

a = 1
console.log("a: ", a)
console.log("!a: ", !a)
console.log("!!a: ", !!a) // writes 1 value in boolean
console.log("\n") // newline

a = ""
console.log("a: ", a)
console.log("!a: ", !a) // writes '"" is NOT true in boolean' value as boolean - So that's true.In boolean empty strings, null and undefined values mean false and if there is a string it means true.
console.log("!!a: ", !!a) // writes "" value in boolean
console.log("\n") // newline

a = "test"
console.log("a: ", a) // writes a value in its kind
console.log("!a: ", !a)
console.log("!!a: ", !!a) // writes "test" value in boolean

console.log("Boolean(a) === !!a: ", Boolean(a) === !!a) // writes true

1 Stimmen

Hochgevotet.. Wollte eigentlich mit dieser Frage antworten, wenn nicht schon hier. Die Verwendung des booleschen Objekts ist imo vom Standpunkt der Lesbarkeit aus gesehen ein besserer Ansatz. Zum Beispiel gibt es keine "Was macht Boolean" SO Frage mit 3k plus upvotes - wie diese aktuelle Frage.

6voto

Lucky Brain Punkte 1401

Es ist wichtig, sich an die Bewertungen zu erinnern true y false en JavaScript :

  • Alles mit einem "Wert" ist true (nämlich wahrheitsgemäß ), zum Beispiel:

    • 101 ,
    • 3.1415 ,
    • -11 ,
    • "Lucky Brain" ,
    • new Object()
    • und, natürlich, true
  • Alles ohne einen "Wert" ist false (nämlich falsy ), zum Beispiel:

    • 0 ,
    • -0 ,
    • "" (leere Zeichenkette),
    • undefined ,
    • null ,
    • NaN (keine Nummer)
    • und, natürlich, false

Die Anwendung der " logisch nicht "-Operator ( ! ) wertet den Operanden aus und wandelt ihn in boolean und verneint sie dann. Zweimaliges Anwenden negiert die Negation und wandelt den Wert effektiv in boolean . Wird der Operator nicht angewandt, so handelt es sich um eine normale Zuweisung des exakten Wertes. Beispiele:

var value = 23; // number
var valueAsNegatedBoolean = !value; // boolean falsy (because 23 is truthy)
var valueAsBoolean = !!value; // boolean truthy
var copyOfValue = value; // number 23

var value2 = 0;
var value2AsNegatedBoolean = !value2; // boolean truthy (because 0 is falsy)
var value2AsBoolean = !!value2; // boolean falsy
var copyOfValue2 = value2; // number 0
  • value2 = value; ordnet das genaue Objekt value auch wenn es nicht boolean daher value2 wird nicht unbedingt als boolean .
  • value2 = !!value; vergibt eine garantierte boolean als das Ergebnis der doppelten Negation des Operanden value und ist gleichwertig mit der folgenden, aber viel kürzer und lesbarer:

    if (value) { value2 = true; } else { value2 = false; }

0 Stimmen

Was bringt das den anderen Antworten an Neuem oder Nützlichem?

1 Stimmen

Keine der anderen Antworten klärt die Konzepte, wie JavaScript auswertet, was ist wahrheitsgemäß o falsy . JavaScript-Neulinge müssen wissen, dass der Operator "not not" implizit die ursprüngliche lose Vergleichsmethode anstelle der exakten === o !== Operatoren und auch die versteckte Cast-Operation, die hinter den Kulissen abläuft und die ich in dem von mir gelieferten Beispiel zeige.

6voto

Abhay Dixit Punkte 960

Verwenden Sie den Operator logisch nicht zwei Mal
es bedeutet !true = false et !!true = true

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