2010-06-17 17 views
5

¿Por qué alguien utilizar una expresión como¿Qué significa esta expresión "!!"

if(!!window.JSON) alert('exists'); 

en lugar de sólo

if(window.JSON) alert('exists'); 

?

¿Hay otro uso para el "!!" cosa?

+0

Múltiples son negativos, aunque para entender, por eso. Si sigues usando if (!! (!!) !!! (!) !! obj) en tu código, solo tú puedes mantenerlo (si tienes suerte) - ¡No estoy tranquilo! – simendsjo

+1

ver http: // stackoverflow.com/questions/1406604/what-do-the-operator-double-exclamation-point-mean-in-javascript/1407769 # 1407769; y tienes razón, en este caso es redundante, ya que 'si()' ya convierte a booleano – Christoph

Respuesta

1

! es una negación lógica, !! es la negación lógica aplicada dos veces, es decir, la identidad lógica

Supongo que el código que está leyendo está siendo inofensivo (aunque confusamente) redundante.

+0

Sí, pero no la cuestión implican un tipo implícito a cielo desde el objeto a booleano? –

15

!! simplemente hará una conversión booleana, no es necesario en absoluto a utilizar esta construcción con la declaración if, también en el primer fragmento, convirtiendo un objeto a booleano no tiene sentido, será siempre es cierto.

Los únicos valores que pueden coaccionar a false son null, undefined, NaN, 0 y cadena vacía y, por supuesto false cualquier otra cosa se coaccionar a true.

Cuando tiene sentido utilizar !! es cuando usted quiere asegurarse de obtener un resultado booleano, por ejemplo cuando se utilizan las lógicas && y || operadores.

Aquellos operadores pueden volver el valor de un operando, y no un resultado booleano, por ejemplo:

true && "foo"; // "foo" 
"foo" || "bar" ; // "foo" 

Imagine que tiene una función que ponen a prueba dos valores, y esperar un resultado booleano:

function isFoo() { 
    return 0 && true; 
} 

isFoo(); // returns 0, here it makes sense to use !! 

Editar: en cuanto a su edición, if (!!window.JSON) es simplemente redundante como he dicho antes, debido a que el if statement por sí mismo wil Realizo la conversión booleana internally cuando se evalúa la expresión de condición.

+0

Parece que tenía la intención de escribir algo como 'function isFoo (obj) {return obj & & true;} isFoo (0);' en el último ejemplo :) o 'return !! obj & & true;' – Znarkus

+0

'false &&" foo "' evalúa a * falso *. – Gumbo

+0

@Gumbo: Sí, fue un error tipográfico s/verdadero/falso, @Znarkus, sí, pero es algo con fines expositivos;) Gracias chicos ... – CMS

2

Probablemente estén intentando convertir el objeto en booleano. Al aplicar un operador booleano (!) al objeto, se convierte en bool, pero en realidad no desean la negación, por lo que aplican una segunda para cancelar la primera.

2
// !! = boolean typecasting in javascript 

var one = 1 
var two = 2; 

if (one==true) app.alert("one==true"); 
if (!!one==true) app.alert("!!one==true"); 

if (two==true) app.alert("two==true"); // won't produce any output 
if (!!two==true) app.alert("!!two==true"); 
+0

es por eso que usted debe usar '' === y convertir explícitamente: el '= = 'las reglas de conversión de tipo son algo así como una WTF – Christoph

1

Es una conversión booleana, asegurando una conversión a boolean la primera vez y luego negando el valor original.

Sin embargo, se utiliza de forma incorrecta aquí y sólo sería realmente relevante si lo ha asignado a otra variable - por razones de rendimiento

var isJSON = (!!window.JSON); 

if (isJSON) doX; 
if (isJSON) doY; 
if (isJSON) doZ; 
Cuestiones relacionadas