2011-09-19 18 views
5

He estado debatiendo este tema con un compañero de trabajo durante aproximadamente una semana. Soy un gran fanático del código abreviado, el uso de ternaries, etc., siempre que puedo. Últimamente, me ha estado molestando sobre mi uso de dobles exclamaciones. Después de realizar numerosas pruebas, estoy empezando a estar de acuerdo con él ... las dobles exclamaciones pueden no ser prudentes en mi código. Considere esto:JS doble exclamación: ¿hay alguna buena razón para usarlo?

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

El ejemplo anterior funciona como se esperaba. Sin embargo, si estamos controlando una variable que puede volver indefinida, obtenemos un error, especialmente en IE7. Tenemos nuestro resultado esperado, sin embargo, si corremos esto en nuestra consola:

if(randomvar) alert('Works'); 

uso de este enfoque, si la variable no está definida, se produce un error en silencio. Esto me hace cuestionar el uso de dobles exclamaciones por completo. ¿Hay alguna situación que realmente haga que este operador sea beneficioso?

Respuesta

5

!!x coerces x a un booleano, con las propiedades x == !!x y typeof !!x === "boolean". (Puede que no sea cierto en general si invalida valueOf, pero no quiero pensarlo en este momento).

9

Hay un uso válido para !! en javascript. Es una expresión que tomará un valor y se convertirá a boolean true o false. Básicamente coacciona el estado actual en un booleano.

Esto es bueno tanto para

  1. Capturar el truthiness del valor
  2. Liberar el objeto original para la recolección (en caso de que sea la referencia final)
  3. Ayuda a prevenir usos más tarde incorrectas de un objeto con igualdad de coerción (==). No los previene a todos pero forzarlo a un bool elimina un conjunto de escenarios.
+0

(Upvote para el uso de la palabra "truthiness"!) gran explicación, es también digno de mención que cuando se utiliza este operador como esto: 'return !! (window.Object && (obj1.function1 || obj.2function2)));' Extiende todo el "forzar la conversión" en todas las cosas. convertallthethings.jpeg –

0

Por lo tanto, entiendo que typeof !!x === "boolean" y la lógica detrás de él (!x arroja como booleano invertida, !!x invierte espalda, etc), pero me pregunto si es problemática por la naturaleza? Si lanzas una variable indefinida, terminas con un error de script en tus manos. Esperaría que !!x == false si typeof !!x === "undefined", pero ese no es el caso. Parece que esta sería la opción más segura:

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

Puede alguien proporcionar un escenario donde el uso !!x es más apropiado? Por el momento, no veo un beneficio para usarlo.

rascándome la cabeza ...

1

he probado en IE - !!undefined vuelve falsa. Lo cual creo que es un comportamiento correcto.

En cuanto a dónde !! es (o podría ser) útil.

He aquí un ejemplo:

Suponga que tiene una función que acepta un parámetro:

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

Llamar con: test(1) no emergerá la ventana de alerta - aunque en general se acepta que 1 es un true o un true -ish valor. Sí, alguien podría argumentar que depende del acuerdo del equipo y de la responsabilidad del desarrollador pasar el tipo de datos correcto, pero ¿cuál es el tipo de datos correcto en JavaScript? Especialmente cuando no tienes un compilador para verificar cuál es cuál.

Así, en la situación anterior, que haría uso de if (!!param) en lugar de if (param === true)

+0

'!! param' y' param === true' no son lo mismo; '!! param' devolverá' false' para cada valor de "falsy", 'false',' undefined', 'NaN') mientras que' param === true' solo devolverá 'true' si' param' es de tipo booleano, y está configurado a 'verdadero'. Como dijo, si el equipo está de acuerdo en que el tipo debe ser booleano, no lo pase otros tipos. Personalmente utilizo la convención de nombrar los parámetros algo relacionado con su tipo al pasarlos a funciones, si requiere un tipo estricto, solo como un recordatorio. Como 'función chocolateStarfish (xInt, yBool) {// stuff};' etc. –

Cuestiones relacionadas