Wenn Sie die Kommentare auf der jQuery- inArray
Seite hier lesen , gibt es eine interessante Erklärung:
!!~jQuery.inArray(elm, arr)
Ich glaube, ein doppeltes Ausrufezeichen konvertiert das Ergebnis in einen Typ boolean
mit dem Wert von true
. Was ich nicht verstehe, ist die Verwendung des ~
Operators tilde ( ) in all dem?
var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }
Überarbeitung der if
Anweisung:
if (!!~jQuery.inArray("one", arr)) { alert("Found"); }
Nervenzusammenbruch:
jQuery.inArray("one", arr) // 0
~jQuery.inArray("one", arr) // -1 (why?)
!~jQuery.inArray("one", arr) // false
!!~jQuery.inArray("one", arr) // true
Mir ist auch aufgefallen, dass das Ergebnis ist, wenn ich die Tilde nach vorne lege -2
.
~!!~jQuery.inArray("one", arr) // -2
Ich verstehe den Zweck der Tilde hier nicht. Kann es bitte jemand erklären oder mich auf eine Ressource hinweisen?
javascript
jquery
operators
bitwise-operators
user717236
quelle
quelle
~jQuery.inArray()
ist tatsächlich sehr nützlich - möglicherweise sogar ein sehr guter Grund, warum die Suchfunktionen-1
wegen eines Fehlers zurückkehren (der einzige Wert, dessen Zweierkomplement falsch ist). Sobald Sie den Trick gesehen und verstanden haben, ist er meiner Meinung nach noch besser lesbar als!= -1
.!!~
für irgendetwas verteidigen .if (x != -1)
undif (~x)
für mich besteht darin, dass Ersteres tatsächlich ausdrückt, was Sie vorhaben. Letzteres drückt aus, dass Sie etwas ganz anderes tun möchten ("Bitte konvertieren Sie meine 64-Bit-Zahl in eine 32-Bit-Ganzzahl und prüfen Sie, ob das bitweise NICHT dieser Ganzzahl wahr ist"), wobei Sie zufällig das gewünschte Ergebnis erzielen ein Fall.>= 0
wahrscheinlich war nicht leet genug, so dass die mehr kryptische!!~
verwendet wurde.Antworten:
Der Tilde-Operator ist überhaupt nicht Teil von jQuery - er ist ein bitweiser NOT-Operator in JavaScript.
Siehe Das große Geheimnis der Tilde (~) .
Sie erhalten seltsame Zahlen in Ihren Experimenten, weil Sie eine bitweise logische Operation für eine Ganzzahl ausführen (die, soweit ich weiß, als Zweierkomplement oder ähnliches gespeichert werden kann ...)
Das Zweierkomplement erklärt, wie eine Zahl binär dargestellt wird. Ich glaube ich hatte recht.
quelle
Es gibt einen bestimmten Grund, vor dem Sie manchmal
~
angewendet sehen$.inArray
.Grundsätzlich,
ist ein kürzerer Weg zu tun
$.inArray
Gibt den Index des Elements im Array zurück, wenn das erste Argument gefunden wird, und -1, wenn es nicht gefunden wird. Dies bedeutet, dass Sie keinen booleschen Vergleich durchführen können, wenn Sie nach einem Booleschen Wert von "Ist dieser Wert im Array?" Suchen, da -1 ein wahrheitsgemäßer Wert ist und wenn $ .inArray 0 (einen falschen Wert) zurückgibt ) bedeutet, dass es tatsächlich im ersten Element des Arrays gefunden wird.Die Anwendung von
~
Bit - Operator bewirkt-1
werden0
, und verursacht 0 werden `-1. Wenn Sie den Wert im Array nicht finden und das bitweise NICHT anwenden, erhalten Sie einen falschen Wert (0). Alle anderen Werte geben Zahlen ungleich 0 zurück und stellen ein wahres Ergebnis dar.Und es wird wie vorgesehen funktionieren.
quelle
!!~expr
bewertet bisfalse
wannexpr
ist-1
anderstrue
.Es ist dasselbe wie
expr != -1
nur kaputt *Dies funktioniert , weil bitweise JavaScript-Operationen die Operanden in vorzeichenbehaftete 32-Bit-Ganzzahlen im Zweierkomplementformat konvertieren. Somit
!!~-1
wird wie folgt bewertet:Bei einem anderen Wert als
-1
wird mindestens ein Bit auf Null gesetzt. Wenn Sie es umkehren, entsteht ein wahrer Wert. bewirbt sich!
Bediener zweimal auf einen truthy Wert wieder boolean wahr.Bei Verwendung mit
.indexOf()
und möchten wir nur überprüfen, ob das Ergebnis ist-1
oder nicht:* *
!!~8589934591
als falsch ausgewertetGräuelkann nicht zuverlässig zum Testen verwendet werden-1
.quelle
~foo.indexOf(bar)
, es sind keine signifikanten Einsparungen bei Zeichen oder Leistung, aber es ist eine relativ häufige Abkürzung in der gleichen Weisefoo = foo || {}
.!!
.>= 0
es nicht das gleiche Verhalten wie!!~
.!== -1
es ist näher.~foo.indexOf(bar)
ist eine gebräuchliche Abkürzung,foo.contains(bar)
weil diecontains
Funktion nicht vorhanden ist.In der Regel ist die Umwandlung in Boolesche Werte aufgrund des JavaScript-Konzepts "falscher" Werte nicht erforderlich. In diesem Fall wird er verwendet, um die Ausgabe der Funktion auf
true
oder zu erzwingenfalse
.quelle
jQuery.inArray()
gibt-1
für "nicht gefunden" zurück, dessen Komplement (~
) ist0
. Somit~jQuery.inArray()
liefert einen falsy Wert (0
) für „nicht gefunden“, und einen truthy Wert (eine negative ganze Zahl ist ) für „gefunden“.!!
wird dann die Falschheit / Wahrheit in echte Booleschefalse
/ formalisierentrue
. Also,!!~jQuery.inArray()
wirdtrue
für "gefunden" undfalse
für "nicht gefunden" geben.quelle
Das
~
für alle 4 Bytesint
entspricht dieser Formel-(N+1)
SO
quelle
~2147483648 != -(2147483648 + 1)
.Der
~
Operator ist der bitweise Komplementoperator. Das Ganzzahlergebnis voninArray()
ist entweder -1, wenn das Element nicht gefunden wird, oder eine nicht negative Ganzzahl. Das bitweise Komplement von -1 (binär als alle 1 Bits dargestellt) ist Null. Das bitweise Komplement einer nicht negativen ganzen Zahl ist immer ungleich Null.Dies ist
!!~i
der Fall,true
wenn die Ganzzahl "i" eine nicht negative Ganzzahl ist undfalse
wenn "i" genau -1 ist.Beachten Sie, dass
~
der Operand immer zur Ganzzahl gezwungen wird. Das heißt, es werden nicht ganzzahlige Gleitkommawerte in ganzzahlige sowie nicht numerische Werte gezwungen.quelle
Tilde ist bitweise NICHT - es invertiert jedes Bit des Wertes. Als Faustregel gilt: Wenn Sie
~
eine Zahl verwenden, wird ihr Vorzeichen invertiert und 1 abgezogen.Wenn Sie dies tun
~0
, erhalten Sie -1 (0 invertiert ist -0, subtrahieren 1 ist -1).Es ist im Wesentlichen eine ausgefeilte, super-mikrooptimierte Methode, um einen Wert zu erhalten, der immer boolesch ist.
quelle
Sie haben Recht: Dieser Code wird zurückgegeben,
false
wenn derindexOf
Aufruf -1 zurückgibt. sonsttrue
.Wie Sie sagen, wäre es viel sinnvoller, so etwas zu verwenden
quelle
.js
. Allerdings könnten sie>=0
eher als!==-1
- keine zusätzlichen Bytes zum Senden verwenden und noch besser lesbar als die Bit-Twiddling-Version.> -1
das noch besser lesbar ist, aber das ist wahrscheinlich sehr subjektiv.Der
~
Operator ist der bitweise NICHT-Operator. Dies bedeutet, dass es eine Zahl in binärer Form annimmt und alle Nullen in Einsen und Einsen in Nullen umwandelt.Zum Beispiel ist die Zahl 0 in binär
0000000
, während -1 ist11111111
. Ebenso ist 100000001
binär, während -2 ist11111110
.quelle
Ich vermute, dass es da ist, weil es ein paar Zeichen kürzer ist (welche Bibliotheksautoren immer danach suchen). Es werden auch Operationen verwendet, die beim Kompilieren in den nativen Code nur wenige Maschinenzyklen dauern (im Gegensatz zum Vergleich mit einer Zahl).
Ich stimme einer anderen Antwort zu, dass dies ein Overkill ist, aber möglicherweise in einer engen Schleife sinnvoll sein kann (erfordert jedoch eine Schätzung des Leistungsgewinns, kann sich andernfalls als vorzeitige Optimierung herausstellen).
quelle
Ich nehme an, da es sich um eine bitweise Operation handelt, ist dies der schnellste (rechnerisch kostengünstige) Weg, um zu überprüfen, ob der Pfad in modifizierten Pfaden angezeigt wird.
quelle
Wie
(~(-1)) === 0
, so:quelle