2009-04-02 16 views
8

Una fuente proyecto abierto JavaScript trabajo en código incluye:Javascript: ¿Por qué comparar con null?

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

Editor no quiere cambiar a

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

de color es una cadena var. Solo se debe usar una cadena de más de 0 caracteres para establecer explícitamente el color.

Dado que JS arroja "" y nulo como booleano falso, ¿por qué sería necesaria la comparación! = Null?

¿Me falta algo al pensar que la primera forma es igual de buena (y un poco más corta) que la segunda?

Veo las comparaciones nulas con bastante frecuencia en JS source. ¿Por qué son necesarios cuando todos los objetos simples de JS tienen resultados conocidos cuando se emiten como booleanos?

Gracias,

Larry

ps. Supongo que si 0 (un entero) fuera un caso válido, entonces (0) sería falso [un problema] y si (0! = Nulo) sería cierto [permite el caso 0]. ¿Alguna otra razón?

pps. Debería haber mencionado que el tapeDiv ​​es de nueva creación. Por lo tanto, no tiene sentido restablecer el estilo a "" ya que el div es completamente nuevo.

Respuesta

5

No, y su ps es correcto. Null evaluaría a falso, y si nulo necesita distinguirse de cadena vacía o 0, entonces haría la verificación nula.

O podría ser solo por claridad. Es más descriptivo indicar que estás buscando específicamente nulo.

+0

Para mí, prefiero que el código sea un poco más corto y asumir que los lectores entienden la lógica de casta y lógica booleana. Quizás sea solo el programador de Ruby en mí. Puede ser tradicional en js deletrear las cosas de forma más detallada ... –

+0

No suele ser así. Recuerde que la fuente de JS en realidad se descarga, por lo que la brevedad es un plus. Y estoy de acuerdo con Larry. No sirve de nada evitar el reconocimiento de la forma en que funciona el tipado y el hechizo de JS. – user37078

1

¿BackgroundColor = "" hace algo? ¿Establece el color el color predeterminado? Si ese es el caso, entonces tendría sentido, como una forma de restablecer el color.

si (color) {}

fallaría si el color es "", pero en el segundo caso se trataría de restablecer el backgroundColor.

0

Si el color puede aparecer como un número entero, no podría establecer el fondo en negro (#000000 = 0).

+1

Pero jpot (abajo) tiene el entendimiento de que establecer el estilo en 0 no da negro en FF, por lo que no debe usarse. –

18

Evaluar la asignación con todos los posibles valores Falsy y obtendrá su respuesta:

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). 

La verificación "if (color)" no dejará que ninguno de ellos a través.

La comprobación de "if (color != null)" permitirá el paso de 1), 2) y 4). 1) no hace nada, 2) no funcionará como se esperaba en Firefox, y 4) siempre funcionará como se espera. Sin embargo, "trabajos" depende de su contexto (que no proporcionó).

Espero que ayude.

+1

Esta es la respuesta más completa. La brevedad no es más importante que el comportamiento determinista. –

0

Solo se debe usar una cadena de más de 0 caracteres para establecer explícitamente el color.

¿Por qué? Asignar la cadena vacía significa que el color se reiniciará (es decir, se usará el valor predeterminado definido por CSS), un caso de uso perfectamente válido.

Todo lo que debe hacer es comprobar si se ha definido color, es decir

typeof color !== 'undefined' 

o si se trata de una variable de cadena

// 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]' 

si podría contener valores de tipo incorrecto.

0

si (color typeof == 'cadena' & & color.length)

Para typeof es suficiente para usar "==" y si la cadena es typeof entonces se comprobará color.length. De lo contrario, saldrá si antes de verificar una segunda condición. Esta creo que es la solución más completa.

Pero, si está seguro de que el color es una variable de cadena y se define en algún lugar antes de inicializarse, podría usar simplemente "if (color)" como lo hizo, pero tenga en cuenta que si el color no está definido en el momento de la declaración if, obtendrá un error de referencia.