2013-09-02 15 views
5

Sto cercando attraverso un codice che qualcun altro ha scritto e ho notato questo strano javascript se la sintassi .. Fondamentalmente, sembra che questo:Javascript - Strano se la sintassi

// 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)) { ... } 

Questa è una di quelle cose che è difficile da google. Qualche gurora Javascript che possa spiegare questo?

+1

possibile duplicato del [Qual è il !!(not not) operator in JavaScript?] (http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript) –

+1

possibile duplicato di [Doppi punti esclamativi?] (http : //stackoverflow.com/questions/9284664/double-exclamation-points) – Quentin

+1

E controlla anche questo http://www.javascriptturnsmeon.com/the-tilde-operator-in-javascript/ –

risposta

11

Gli operatori unari del genere devono solo essere interpretati da destra a sinistra. ~ è l'operatore "non" bit per bit e ! è l'inverso booleano. Così, quei tre:

  • convertire il valore restituito in un numero intero
  • invertire i bit del numero intero
  • controllare il numero di "truthiness" (zero o non zero, false o true)
  • invertire il valore booleano
  • invertito di nuovo

il ~ qui è la tricki est. La routine di "ricerca" (suppongo) restituisce -1 quando non trova nulla. L'operatore ~ diventa -1 a 0, pertanto lo ~ consente di interpretare il valore di ritorno di "ricerca" come true (diverso da zero) se la destinazione viene trovata e false (zero) se non.

La successiva applicazione di ! — due volte — impone al risultato di essere un vero valore booleano. Viene applicato due volte in modo che venga mantenuta la sensazione true/false. modifica Si noti che la conversione forzata in booleana non è affatto necessaria in questo particolare codice; la semantica normale dell'istruzione if funzionava correttamente solo con il risultato dell'operatore ~.

+0

@NPE aggiornato ora – Pointy

+0

Per riferimento, il '!!' è completamente inutile qui. Ne avresti bisogno solo se stavi memorizzando il risultato per dopo e volessi essere sicuro che fosse un booleano. Per uso immediato in un 'se', è eccessivo. – cHao

+0

@cHao sì, in * questo * esempio non è necessario. – Pointy

4

Fondamentalmente, .search restituisce la posizione in cui trova il risultato o -1 se non corrisponde. normali la gente sarebbe solo scrivere:

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

Ma personalmente mi basta usare:

if(varA.match(re)) 
+1

tuo secondo esempio potrebbe tornare 'true' per' -1', dando un falso positivo – Bojangles

+1

@Bojangles: devo essere manca qualcosa. Non vedo l'opportunità di un falso positivo qui. Nota che il secondo esempio usa '.match' piuttosto che' .search'. – cHao

+0

Se 'varA.search()' restituisce '-1', il' if() 'in grado di soddisfare, tuttavia _no partita è stata found_, quindi un falso positivo – Bojangles