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

21voto

Navin Rauniyar Punkte 9357

El !! Konstrukt ist ein einfacher Weg, um jeden JavaScript-Ausdruck in sein boolesches Äquivalent.

Zum Beispiel: !!"he shot me down" === true y !!0 === false .

2 Stimmen

Das kommt der wichtigen Unterscheidung sehr nahe. Entscheidend ist, dass 0 === false falsch ist und !!0 === false wahr ist.

21voto

Justin Johnson Punkte 30194

Es ist nicht nur ein Betreiber, es sind zwei. Er entspricht dem Folgenden und ist eine schnelle Methode, um einen Wert in einen booleschen Wert umzuwandeln.

val.enabled = !(!enable);

20voto

Khuong Punkte 10446

Es zwingt alle Dinge zu booleschen.

Zum Beispiel:

console.log(undefined); // -> undefined
console.log(!undefined); // -> true
console.log(!!undefined); // -> false

console.log('abc'); // -> abc
console.log(!'abc'); // -> false
console.log(!!'abc'); // -> true

console.log(0 === false); // -> undefined
console.log(!0 === false); // -> false
console.log(!!0 === false); // -> true

17voto

Darren Clark Punkte 2853

Ich vermute, dass dies ein Überbleibsel aus C++ ist, wo man den Operator ! überschreibt, aber nicht den Operator bool.

Um in diesem Fall eine negative (oder positive) Antwort zu erhalten, müssten Sie zunächst den Operator ! verwenden, um einen booleschen Wert zu erhalten, aber wenn Sie den positiven Fall überprüfen wollten, würden Sie !! verwenden.

15voto

Kirby L. Wallace Punkte 552

Diese Frage wurde bereits ausführlich beantwortet, aber ich möchte eine Antwort hinzufügen, die hoffentlich so einfach wie möglich ist und die Bedeutung von !! so leicht wie möglich verständlich macht.

Da Javascript hat, was genannt werden "truthy" und "falsey" Werte, gibt es Ausdrücke, die, wenn in anderen Ausdrücken ausgewertet wird in einem wahren oder falschen Zustand führen, auch wenn der Wert oder Ausdruck untersucht wird, ist nicht wirklich true o false .

Zum Beispiel:

if (document.getElementById('myElement')) {
    // code block
}

Wenn dieses Element tatsächlich existiert, wird der Ausdruck als wahr ausgewertet, und der Codeblock wird ausgeführt.

Allerdings:

if (document.getElementById('myElement') == true) {
    // code block
}

...führt NICHT zu einer wahren Bedingung, und der Codeblock wird nicht ausgeführt, selbst wenn das Element vorhanden ist.

Warum? Weil document.getElementById() ist ein "wahrheitsgemäßer" Ausdruck, der in diesem Fall als wahr ausgewertet wird if() Anweisung, aber es handelt sich nicht um einen tatsächlichen booleschen Wert von true .

Das doppelte "nicht" ist in diesem Fall ganz einfach. Es sind einfach zwei not s hintereinander.

Die erste "invertiert" einfach den wahren oder falschen Wert, was zu einem tatsächlichen booleschen Typ führt, und die zweite "invertiert" ihn wieder in seinen ursprünglichen Zustand zurück, aber jetzt in einen tatsächlichen booleschen Wert. Auf diese Weise erhalten Sie Konsistenz:

if (!!document.getElementById('myElement')) {}

et

if (!!document.getElementById('myElement') == true) {}

geben erwartungsgemäß BEIDE true zurück.

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