!!
ist ähnlich wie die Verwendung des Boolescher Konstruktor oder wohl eher die Boolesche Funktion.
console.log(Boolean(null)); // Preferred over the Boolean object
console.log(new Boolean(null).valueOf()); // Not recommended for coverting non-boolean values
console.log(!!null); // A hacky way to omit calling the Boolean function, but essentially does the same thing.
// The context you saw earlier (your example)
var vertical;
function Example(vertical)
{
this.vertical = vertical !== undefined ? !!vertical :
this.vertical;
// Let's break it down: If vertical is strictly not undefined, return the boolean value of vertical and set it to this.vertical. If not, don't set a value for this.vertical (just ignore it and set it back to what it was before; in this case, nothing).
return this.vertical;
}
console.log( "\n---------------------" )
// vertical is currently undefined
console.log(new Example(vertical).vertical); // The falsey or truthy value of this.vertical
console.log(!!new Example(vertical).vertical); // Coerced value of this.vertical
vertical = 12.5; // set vertical to 12.5, a truthy value.
console.log(new Example(vertical).vertical); // The falsey or truthy value of this.vertical which happens to be true anyway
console.log(!!new Example(vertical).vertical); // Coerced value of this.vertical
vertical = -0; // set vertical to -0, a falsey value.
console.log(new Example(vertical).vertical); // The falsey or truthy value of this.vertical which happens to be false either way
console.log(!!new Example(vertical).vertical); // Coerced value of this.vertical
Falsey-Werte in Javascript erzwingen a falsch y wahrhaftige Werte erzwingen a wahr. Falsche und wahrheitsgemäße Werte können auch verwendet werden in if
Anweisungen und werden im Wesentlichen auf ihren entsprechenden booleschen Wert "abgebildet". Allerdings werden Sie wahrscheinlich nicht oft mit echten booleschen Werten arbeiten müssen, da sie sich meist in der Ausgabe (Rückgabewerte) unterscheiden.
Auch wenn dies dem Casting ähnlich zu sein scheint, handelt es sich realistischerweise wahrscheinlich um eine nur Zufall und ist nicht "gebaut" oder absichtlich für und wie ein boolescher Cast gemacht. Also sollten wir es nicht so nennen.
Warum und wie es funktioniert
Um es kurz zu machen: Es sieht ungefähr so aus: `! ( !null )`. Wobei `null` **falsch** ist, also wäre `!null` **wahr**. Dann wäre `!true` **false** und es würde im Wesentlichen *zurückkehren* zu dem, was es vorher war, nur dieses Mal als *richtiger boolescher Wert* (oder sogar *umgekehrt* mit *wahren Werten* wie `{}` oder `1`).
Um auf Ihr Beispiel zurückzukommen
Insgesamt passt der Kontext, den Sie gesehen haben, einfach `this.vertical` an, je nachdem, ob `vertical` definiert ist oder nicht, und wenn ja, wird er auf den resultierenden booleschen Wert von vertical gesetzt, andernfalls ändert er sich nicht. Mit anderen Worten, wenn `vertical` definiert ist, wird `this.vertical` auf den booleschen Wert von vertical gesetzt, andernfalls bleibt es gleich. Ich denke, das ist an sich ein Beispiel dafür, wie man `!!` verwenden kann und was es bewirkt.
Vertikales E/A-Beispiel
Führen Sie dieses Beispiel aus und ändern Sie den vertikalen Wert in der Eingabe. Sehen Sie sich an, was das Ergebnis ist, damit Sie den Code Ihres Kontexts besser verstehen können. Geben Sie in die Eingabe einen beliebigen gültigen Javascript-Wert ein. Vergessen Sie nicht, die Anführungszeichen einzuschließen, wenn Sie eine Zeichenfolge testen. Kümmern Sie sich nicht zu sehr um den CSS- und HTML-Code, führen Sie einfach dieses Snippet aus und spielen Sie damit herum. Sie sollten jedoch einen Blick auf den nicht DOM-bezogenen Javascript-Code werfen (die Verwendung des Example-Konstruktors und der vertikalen Variablen).
var vertical = document.getElementById("vertical");
var p = document.getElementById("result");
function Example(vertical)
{
this.vertical = vertical !== undefined ? !!vertical :
this.vertical;
return this.vertical;
}
document.getElementById("run").onclick = function()
{
p.innerHTML = !!( new Example(eval(vertical.value)).vertical );
}
input
{
text-align: center;
width: 5em;
}
button
{
margin: 15.5px;
width: 14em;
height: 3.4em;
color: blue;
}
var
{
color: purple;
}
p {
margin: 15px;
}
span.comment {
color: brown;
}
<!--Vertical I/O Example-->
<h4>Vertical Example</h4>
<code id="code"><var class="var">var</var> vertical = <input type="text" id="vertical" maxlength="9" />; <span class="comment">// enter any valid javascript value</span></code>
<br />
<button id="run">Run</button>
<p id="result">...</p>
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.