2010-09-01 7 views
7

A menudo veo el código JavaScript en una función puede tomar en un objeto "opciones" y utilizarlo como:JavaScript cheque indefinido

var name = typeof options.name !== 'undefined' ? options.name : "Bob"; 

Esto parece que sería equivalente a lo siguiente:

var name = options.name || "Bob"; 

Ahora, entiendo que en determinadas situaciones puede que realmente le importe que options.name sea undefined frente a null y esto tiene sentido para mí, pero a menudo veo esto en situaciones donde esta distinción no es necesaria.

Creo que he oído que la gente escribe código como este debido a algún error en IE. ¿Puede alguien elaborar por favor?

Respuesta

6

No soy consciente del error en el IE, pero esas declaraciones no son exactamente equivalentes:

  • El primero establece la variable name al valor predeterminado "Bob" sólo cuando es options.nameundefined.

  • El segundo establece la variable name en "Bob" cuando options.name es falso. Puede ser una cadena vacía, el valor null, un valor de 0, el valor NaN, el valor booleano false y también undefined.

Por ejemplo, si options.name === 0, la primera instrucción establece la variable name a 0, mientras que la segunda declaración fijará a "Bob".

2

Espero que esto dependa de lo que el desarrollador realmente intenta hacer en lugar de cualquier convención a la que se suscriba. En muchos casos, el name = options.name || "Bob"; más corto podría terminar dándole valores que no espera si no conoce su comportamiento real porque coacciona un valor booleano de options.name. En otros casos, otros valores de "falsy" serán imposibles (o casi imposibles): si el valor proviene de un elemento de formulario, por ejemplo, realmente no necesita preocuparse por undefined, null, false o 0 - it siempre debe ser una cadena, siempre y cuando el elemento de formulario exista; por lo tanto, lo que esta comprobación debería hacer es garantizar que el campo no sea una cadena en blanco (aunque se abriría cualquier espacio en blanco). Otro patrón común similar a options.name || "Bob" es if (options.name) {...}, que tiene los mismos problemas/beneficios potenciales.

Cuestiones relacionadas