2009-04-02 11 views
8

Un progetto open source JavaScript Io lavoro su include il codice:Javascript: perché confrontare con null?

if (color) { 
     tapeDiv.style.backgroundColor = color; 
     // set color here if defined by event. Else use css 
    } 

Un collaboratore vuole cambiarlo in

if (color != null) { // this line changed 
     tapeDiv.style.backgroundColor = color; 
     // set color here if defined by event. Else use css 
    } 

colore è un var stringa. È necessario utilizzare solo una stringa con più di 0 caratteri per impostare in modo esplicito il colore.

Dato che JS lancia "" e null come booleano falso, perché sarebbe necessario il confronto! = Null?

Mi manca qualcosa pensando che la prima forma sia altrettanto buona (e un po 'più corta) della seconda?

Vedo paragoni con null abbastanza spesso nella sorgente JS. Perché sono necessari quando tutti gli oggetti semplici di JS hanno dei risultati noti quando vengono lanciati come booleani?

Grazie,

Larry

ps. Suppongo che se 0 (un intero) fosse un caso valido, allora se (0) sarebbe falso [un problema] e se (0! = Null) sarebbe vero [consente il caso 0]. Qualche altra ragione?

pps. Dovrebbe aver detto che il tapeDiv ​​è stato appena creato. Quindi non c'è motivo di reimpostare lo stile su "" dal momento che il div è nuovo di zecca.

risposta

5

No, e il tuo ps è corretto. Null valuterà in falso, e se nullo deve essere distinto dalla stringa vuota o 0, allora si farebbe il controllo nullo.

Oppure potrebbe essere solo per chiarezza. È più descrittivo per indicare che stai specificatamente cercando null.

+0

Per me, preferirei che il codice fosse leggermente più breve e che i lettori capissero la casta e la logica booleana. Forse è solo il programmatore Ruby in me. Può essere tradizionale in js scrivere le cose in modo più dettagliato ... –

+0

Non di solito. Ricorda che la fonte di JS è effettivamente scaricata, quindi la brevità è un vantaggio. E sono d'accordo Larry. È inutile evitare il riconoscimento del modo in cui la tipizzazione e il casting di JS funzionano. – user37078

1

does backgroundColor = "" fare qualcosa? Questo imposta il colore sul colore predefinito? Se questo è il caso, allora avrebbe senso, come un modo per ripristinare il colore.

se (a colori) {}

fallirebbe se il colore è "", ma nel tuo secondo caso sarebbe ripristinare il backgroundColor.

0

Se il colore può entrare come numero intero, non è possibile impostare lo sfondo in nero (#000000 = 0).

+1

Ma jpot (sotto) ha la consapevolezza che l'impostazione dello stile su 0 non dà il nero su FF, quindi non dovrebbe essere usato. –

18

Valutare l'assegnazione di tutti i possibili valori falsy e avrai la tua risposta:

tapeDiv.style.backgroundColor = false; // does nothing 

tapeDiv.style.backgroundColor = 0;  // sets as "black", 
             // but ignored by FF 

tapeDiv.style.backgroundColor = null; // resets the background-color 
             // to use whatever is defined 
             // in a stylesheet (if any), 
             // but ignored by IE. 

tapeDiv.style.backgroundColor = ''; // resets the background-color 
             // to use whatever is defined 
             // in a stylesheet (if any). 

Il controllo per "if (color)" non permetterà che nessuno di loro tramite.

Il controllo per "if (color != null)" consentirà 1), 2) e 4) attraverso. 1) non fa nulla, 2) non funzionerà come previsto in Firefox, e 4) funzionerà sempre come previsto. Tuttavia, "funziona" dipende dal tuo contesto (che non hai fornito).

Spero che questo aiuti.

+1

Questa è la risposta più completa. La brevità non è più importante del comportamento deterministico. –

0

Solo una stringa con più di 0 caratteri deve essere utilizzata per impostare in modo esplicito il colore.

Perché? Assegnare una stringa vuota significa che il colore verrà ripristinato (cioè verrà utilizzato il valore predefinito definito da CSS), un caso d'uso perfettamente valido.

Tutto quello che dovete fare è controllare se color è definito, vale a dire

typeof color !== 'undefined' 

o se si tratta di una variabile stringa

// checks for primitive strings 
typeof color === 'string' 

// checks for primitive strings and string objects 
typeof color === 'string' || color instanceof String 

// checks for primitive strings and string objects, cross-frame safe 
Object.prototype.toString.call(color) === '[object String]' 

se potrebbe contenere valori di tipo non corretto.

0

se (colore typeof == 'stringa' & & color.length)

Per typeof è sufficiente utilizzare "==" e se il typeof è stringa allora sarà verificare la presenza di color.length. Altrimenti, uscirà se prima controlla la seconda condizione. Questa credo sia la soluzione più completa.

Tuttavia, se si è certi che il colore è una variabile stringa e viene definito da qualche parte prima dell'inizializzazione, è possibile utilizzare solo "if (color)" come si faceva, ma si tenga presente che se il colore non è definito in al momento dell'istruzione if, si otterrà un ReferenceError.

Problemi correlati