Wie ändert !!~ (nicht Tilde/Bang-Bang-Tilde) das Ergebnis eines ‘enthält/eingeschlossen’-Array-Methodenaufrufs?

Lesezeit: 6 Minuten

Wie andert nicht TildeBang Bang Tilde das Ergebnis eines enthalteingeschlossen Array Methodenaufrufs
Benutzer717236

Wenn Sie die Kommentare bei der jQuery lesen inArray Seite Hier, es gibt eine interessante Erklärung:

!!~jQuery.inArray(elm, arr) 

Jetzt glaube ich, dass ein doppeltes Ausrufezeichen das Ergebnis in Typ umwandelt boolean, mit dem Wert von true. Was ich nicht verstehe ist die Verwendung der Tilde (~) Operator in all dem?

var arr = ["one", "two", "three"];
if (jQuery.inArray("one", arr) > -1) { alert("Found"); }

Refactoring der if Erklärung:

if (!!~jQuery.inArray("one", arr)) { alert("Found"); }

Abbauen:

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 wenn ich die Tilde voranstelle, das Ergebnis ist -2.

~!!~jQuery.inArray("one", arr) // -2

Ich verstehe den Zweck der Tilde hier nicht. Kann mir das bitte jemand erklären oder auf eine Ressource hinweisen?

  • Wer so einen Code schreiben möchte, muss von der Tastatur Abstand nehmen.

    – Kirk Woll

    16. Februar ’12 um 18:11


  • @KirkWoll: Warum? ~jQuery.inArray() ist eigentlich sehr nützlich – möglicherweise sogar ein sehr guter Grund, warum die Suchfunktionen zurückkehren -1 für Fehler (der einzige Wert, dessen Zweierkomplement falsch ist). Wenn du den Trick erst einmal gesehen und verstanden hast, finde ich ihn noch lesbarer als != -1.

    – Amadan

    16. Februar ’12 um 18:20


  • @Amadan – nein. Einfach nein. Im Ernst, ich kann nicht glauben, dass du verteidigst !!~ Pro irgendetwas.

    – Kirk Woll

    16. Februar ’12 um 18:23


  • Das Problem ist, es ist nur das: Ein “Trick”. Der Hauptunterschied zwischen if (x != -1) und if (~x) für mich ist, dass ersteres tatsächlich ausdrückt, was Sie beabsichtigen zu tun. 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 erhalten ein Fall.

    – JimmiTh

    16. Februar ’12 um 18:50


  • >= 0 war es wahrscheinlich nicht leet genug, desto kryptischer !!~ wurde benutzt.

    – Yoshi

    14. Mai ’12 um 11:23


Wie andert nicht TildeBang Bang Tilde das Ergebnis eines enthalteingeschlossen Array Methodenaufrufs
Yahel

Es gibt einen bestimmten Grund, den Sie manchmal sehen werden ~ angewendet vor $.inArray.

Grundsätzlich,

~$.inArray("foo", bar)

ist ein kürzerer Weg

$.inArray("foo", bar) !== -1

$.inArray gibt den Index des Elements im Array zurück, wenn das erste Argument gefunden wird, und gibt -1 zurück, wenn es nicht gefunden wird. Wenn Sie also nach einem booleschen Wert von “Ist dieser Wert im Array?” suchen, können Sie keinen booleschen Vergleich durchführen, da -1 ein wahrer Wert ist und wenn $.inArray 0 zurückgibt (ein falscher Wert ), bedeutet dies, dass es sich tatsächlich im ersten Element des Arrays befindet.

Anwenden der ~ bitweise Operator verursacht -1 werden 0, und bewirkt, dass 0 zu `-1 wird. Wenn der Wert im Array nicht gefunden und das bitweise NOT angewendet wird, führt dies zu einem falschen Wert (0), und alle anderen Werte geben Nicht-0-Zahlen zurück und stellen ein wahrheitsgetreues Ergebnis dar.

if (~$.inArray("foo", ["foo",2,3])) {
    // Will run
}

Und es wird wie beabsichtigt funktionieren.

  • Wie gut wird dies in Browsern unterstützt (jetzt im Jahr 2014?) Oder wurde es die ganze Zeit perfekt unterstützt?

    – Explosionspillen

    12. März ’14 um 22:46

  • Ich wäre überrascht, wenn grundlegende Operationen wie diese nicht perfekt wären.

    – pcarvalho

    30. Mai ’15 um 23:06

1641750949 256 Wie andert nicht TildeBang Bang Tilde das Ergebnis eines enthalteingeschlossen Array Methodenaufrufs
Salman A

!!~expr bewertet zu false Wenn expr ist -1 ansonsten true.
Es ist dasselbe wie expr != -1, nur kaputt*


Es funktioniert, weil Bitweise JavaScript-Operationen Konvertieren der Operanden in 32-Bit-Ganzzahlen mit Vorzeichen im Zweier-Komplement-Format. Daher !!~-1 wird wie folgt bewertet:

   -1 = 1111 1111 1111 1111 1111 1111 1111 1111b // two's complement representation of -1
  ~-1 = 0000 0000 0000 0000 0000 0000 0000 0000b // ~ is bitwise not (invert all bits)
   !0 = true                                     // ! is logical not (true for falsy)
!true = false                                    // duh

Ein anderer Wert als -1 wird mindestens ein Bit auf Null gesetzt haben; das Invertieren wird einen wahrheitsgetreuen Wert erzeugen; bewirbt sich ! Operator zweimal zu einem true-Wert gibt den booleschen Wert true zurück.

Bei Verwendung mit .indexOf() und wir wollen nur prüfen, ob das Ergebnis ist -1 oder nicht:

!!~"abc".indexOf("d") // indexOf() returns -1, the expression evaluates to false
!!~"abc".indexOf("a") // indexOf() returns  0, the expression evaluates to true
!!~"abc".indexOf("b") // indexOf() returns  1, the expression evaluates to true

* !!~8589934591 wird zu false ausgewertet, also Gräuel kann nicht zuverlässig zum Testen verwendet werden -1.

  • In einer stabilen Bibliothek sehe ich kein Problem mit der Verwendung ~foo.indexOf(bar), es sind keine signifikanten Einsparungen bei Charakteren oder Leistung, aber es ist eine relativ gebräuchliche Kurzschrift auf die gleiche Weise wie foo = foo || {} ist.

    – zzzzBov

    14. Mai ’12 um 13:18

  • Es ist kein Problem … zumindest bis jemand anderes aufgefordert wird, mit Ihrem Code fortzufahren.

    – Salman A

    14. Mai ’12 um 15:32 Uhr

  • @ahsteele, ich kenne diese Regel gut, aber bitweise Operatoren sind Teil jeder Programmiersprache, die mir einfällt. Ich versuche so zu programmieren, dass es für jemanden lesbar ist wer kann code lesen. Ich höre nicht auf, Funktionen einer Sprache zu verwenden, nur weil jemand anderes sie nicht versteht, sonst könnte ich sie nicht einmal verwenden !!.

    – zzzzBov

    14. Mai ’12 um 16:18

  • Genau genommen, >= 0 hat nicht das gleiche verhalten wie !!~. !== -1 es ist näher.

    – Peter Olson

    22. August ’12 um 23:27


1641750949 538 Wie andert nicht TildeBang Bang Tilde das Ergebnis eines enthalteingeschlossen Array Methodenaufrufs
pglhall

Der Tilde-Operator ist eigentlich gar kein Teil von jQuery – es ist ein bitweiser NOT-Operator in JavaScript selbst.

Sehen Das große Geheimnis der Tilde(~).

Sie erhalten seltsame Zahlen in Ihren Experimenten, weil Sie eine bitweise logische Operation an einer Ganzzahl durchführen (die, soweit ich weiß, als Zweierkomplement oder so ähnlich gespeichert werden kann …)

Zweierkomplement erklärt, wie man eine Zahl binär darstellt. Ich glaube, ich hatte recht.

  • Fest! (Ich habe es in einen anderen Link geändert, der bizarrerweise nach meiner ursprünglichen Antwort geschrieben wurde …)

    – pglhall

    26. Juni ’13 um 8:56

~foo.indexOf(bar) ist eine gängige Kurzform für die Darstellung foo.contains(bar) weil der contains Funktion existiert nicht.

Normalerweise ist die Umwandlung in einen booleschen Wert aufgrund des JavaScript-Konzepts der “falschen” Werte unnötig. In diesem Fall wird es verwendet, um die Ausgabe der Funktion zu erzwingen true oder false.

jQuery.inArray() kehrt zurück -1 für “nicht gefunden”, dessen Komplement (~) ist 0. Daher, ~jQuery.inArray() gibt einen falschen Wert zurück (0) für “nicht gefunden” und ein wahrer Wert (eine negative ganze Zahl) für “gefunden”. !! wird dann die Falschheit/Wahrheit in echte Boolesche Werte formalisieren false/true. So, !!~jQuery.inArray() wird geben true für “gefunden” und false für “nicht gefunden”.

Der ~ für alle 4 Byte int ist gleich dieser Formel -(N+1)

ALSO

~0   = -(0+1)   // -1
~35  = -(35+1)  // -36 
~-35 = -(-35+1) //34 

1641750949 142 Wie andert nicht TildeBang Bang Tilde das Ergebnis eines enthalteingeschlossen Array Methodenaufrufs
Joe

Tilde ist bitweises NOT – es invertiert jedes Bit des Wertes. Als allgemeine Faustregel gilt, wenn Sie ~ bei einer Zahl wird das Vorzeichen invertiert, dann wird 1 subtrahiert.

Also, wenn Sie es tun ~0, erhalten Sie -1 (0 invertiert ist -0, subtrahieren 1 ist -1).

Es ist im Wesentlichen eine ausgeklügelte, super-mikrooptimierte Methode, um einen Wert zu erhalten, der immer boolesch ist.

.

230770cookie-checkWie ändert !!~ (nicht Tilde/Bang-Bang-Tilde) das Ergebnis eines ‘enthält/eingeschlossen’-Array-Methodenaufrufs?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy