2011-09-19 46 views
5

Ho discusso questo argomento con un collega per circa una settimana. Sono molto appassionato di codice stenografico, utilizzo di ternari, ecc., Ovunque io sia. Ultimamente, mi sta prendendo in giro per il mio uso di doppie esclamazioni. Dopo aver eseguito numerosi test, sto iniziando ad essere d'accordo con lui ... le doppie esclamazioni potrebbero non essere saggia da usare nel mio codice. Considera questo:JS doppio punto esclamativo: c'è qualche buona ragione per usarlo?

var myvar = "Hello"; 
return (!!myvar ? "Var is set" : "Var is not set"); 

L'esempio precedente funziona come previsto. Tuttavia, se stiamo controllando una variabile che può tornare indefinita, otteniamo un errore, specialmente in IE7. Otteniamo il nostro risultato atteso, tuttavia, se corriamo questo nella nostra console:

if(randomvar) alert('Works'); 

Usando questo approccio, se la variabile non è definita, non riesce in silenzio. Questo mi fa dubitare dell'uso di doppie esclamazioni. C'è una situazione che rende davvero utile questo operatore?

risposta

5

!!x ha sostituito e typeof !!x === "boolean" con un valore booleano x == !!x. (Potrebbe non essere vero in generale se si sostituisce valueOf, ma non voglio pensarci al momento.)

9

C'è un uso valido per !! in javascript. È un'espressione che prenderà un valore e convertirà nel booleano true o false. Costituisce essenzialmente uno stato corrente in un booleano.

Questo è buono per entrambi

  1. Catturando l'truthiness del valore
  2. Liberando l'oggetto originale per la raccolta (che dovrebbe essere il riferimento finale)
  3. Aiuta a prevenire utilizzi successivamente errate di un oggetto con uguaglianza coercitiva (==). Non li impedisce tutti, ma costringendolo a un bool rimuove una serie di scenari.
+0

(Upvote per usare la parola "truthiness"!) grande spiegazione, è anche la pena notare che quando si utilizza questo operatore in questo modo: 'return !! (window.Object && (obj1.function1 || obj.2function2)));' Estende l'intero "forzare la conversione" su tutte le cose. convertallthethings.jpeg –

0

Così, ho capito che typeof !!x === "boolean" e la logica dietro di esso (!x getta come booleano invertita, !!x inverte indietro, ecc), ma mi chiedo se è problematico per natura? Se lanci una variabile non definita, ti ritroverai con un errore di script nelle tue mani. Mi aspetterei che !!x == false se typeof !!x === "undefined", ma questo non è il caso. Sembra che questa sarebbe la scelta più sicura:

if((typeof x != "undefined") && (x != null)) { ... } 

Qualcuno può fornire uno scenario in cui utilizza !!x è più appropriato? Al momento, non vedo un vantaggio nell'usarlo.

graffiare la mia testa ...

1

ho testato in IE - !!undefined restituisce false. Quale credo un comportamento corretto.

Per quanto riguarda dove !! è (o potrebbe essere) utile.

Ecco un esempio:

Supponiamo di avere una funzione che accetta un parametro:

function test(param) { if (param === true) { alert('OK'); } }

chiamata con: test(1) non farà apparire l'avviso della finestra - anche se è generalmente accettato che 1 è a true o a un valore true -ish. Sì, qualcuno potrebbe obiettare che spetta al contratto nel team e a ciascuna responsabilità dello sviluppatore passare il tipo di dati curret - ma qual è il tipo di dati corretto in JavaScript? Soprattutto quando non hai un compilatore per verificare quale è quale.

Così nella situazione di cui sopra, mi piacerebbe utilizzare if (!!param) invece di if (param === true)

+0

'!! param' e' param === true' non sono la stessa cosa; '!! param' restituirà' false' per ogni valore "falsy", 'false',' indefinito', 'NaN') mentre' param === true' restituirà 'true' solo se 'param' è di tipo booleano, ed è impostato su 'true'. Come hai detto tu, se il team è d'accordo sul fatto che il tipo dovrebbe essere Booleano, non passare altri tipi. Io personalmente uso la convenzione di nominare i parametri qualcosa di relativo al loro tipo quando li si passa in funzioni, se richiede un tipo rigoroso, proprio come un promemoria. Mi piace 'function chocolateStarfish (xInt, yBool) {// stuff};' ecc. –

Problemi correlati