2013-09-02 9 views
5

ich durch einige Code suchen, dass jemand anderes geschrieben haben, und ich bemerkte, diese seltsame Javascript wenn Syntax .. Basicly, es sieht wie folgt aus:Javascript - seltsam, wenn Syntax

// This is understandable (but I dont know if it have relevance) 
var re = new RegExp("^" + someVar + "_", "i"); 

// !!~ ??? What is this black magic? 
if (!!~varA.search(re)) { ... } 

Dies ist eines jener Dinge, die ist schwer zu googeln. Irgendwelche Javascript-Gurus, die das erklären können?

+1

möglich Duplikat [Was ist !!(nicht nicht) Operator in JavaScript?] (http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript) –

+1

mögliches Duplikat von [doppelte Ausrufezeichen?] (http : //stackoverflow.com/questions/9284664/double-exclamation-points) – Quentin

+1

Und überprüfen Sie auch diese http://www.javascriptturnsmeon.com/the-tilde-operator-in-javascript/ –

Antwort

11

Unäre Operatoren wie diese müssen nur von rechts nach links interpretiert werden. ~ ist der bitweise "nicht" -Operator und ! ist die boolesche Inverse. Damit diese drei:

  • wandeln den Rückgabewert auf einen ganzzahligen
  • die Bits des ganzzahligen invertieren
  • inspizieren die Nummer für „Iness“ (Null oder ungleich Null ist, false oder true)
  • invertieren den booleschen Wert
  • Invertzucker es wieder

die ~ hier ist die tricki Europäische Sommerzeit. Die "Such" -Routine (ich vermute) gibt -1 zurück, wenn sie nichts findet. Der Operator ~ wird -1 zu 0, so dass die ~ ermöglicht, den Rückgabewert "Suche" als true (nicht Null) zu interpretieren, wenn das Ziel gefunden wird, und false (Null), wenn nicht.

Die nachfolgende Anwendung von ! — zweimal — zwingt das Ergebnis zu einem wahren booleschen Wert. Es wird zweimal angewendet, so dass der true/false Sinn beibehalten wird. bearbeiten Beachten Sie, dass die erzwungene Konvertierung zu Boolean in diesem bestimmten Code überhaupt nicht erforderlich ist; Die normale Semantik der Anweisung if würde nur mit dem Ergebnis des Operators ~ funktionieren.

+0

@NPE jetzt aktualisiert – Pointy

+0

Als Referenz ist das '!!' hier völlig unnötig. Sie würden es nur brauchen, wenn Sie das Ergebnis für später speichern und sichergehen wollten, dass es ein boolescher Wert ist. Für den sofortigen Einsatz in einem 'if' ist es Overkill. – cHao

+0

@cHao ja, in * diesem * Beispiel ist es nicht notwendig. – Pointy

4

Grundsätzlich gibt .search die Position zurück, an der das Ergebnis gefunden wird, oder -1, wenn es nicht übereinstimmt. Normale Leute würden nur schreiben:

if(varA.search(re) > -1) 

Aber persönlich würde ich nur verwenden:

if(varA.match(re)) 
+1

Ihr zweites Beispiel würde 'true' für' -1' zurückgeben, was eine falsch positive – Bojangles

+1

@Bojangles: Ich muss etwas verpassen. Ich sehe hier keine Möglichkeit für ein falsches positives. Beachten Sie, dass das zweite Beispiel '.match' statt' .search' verwendet. – cHao

+0

Wenn 'varA.search()' '-1' zurückgibt, wird' if() 'genügen, jedoch wurde keine Übereinstimmung gefunden_, daher ein falscher positiver Wert – Bojangles