tipos mostrar manipular insertar imagenes imagen guardar funciones ejemplos ejemplo con array javascript html5

javascript - mostrar - ¿Alguien puede explicar este truco ''doble negativo''?



prompt javascript ejemplo (9)

¡El primero ! coacciona la variable a un tipo booleano y la invierte. ¡El segundo ! lo invierte de nuevo (proporcionándole el valor booleano original (correcto) para lo que esté comprobando).

Para mayor claridad, sería mejor que

return Boolean(....);

Esta pregunta ya tiene una respuesta aquí:

De ninguna manera soy un experto en Javascript, pero he estado leyendo la página web "Sumérgete en HTML5" de Mark Pilgrim y mencionó algo que me gustaría conocer mejor.

El afirma:

Finalmente, usa el truco doble negativo para forzar el resultado a un valor booleano (verdadero o falso).

function supports_canvas() { return !!document.createElement(''canvas'').getContext; }

¡Si alguien puede explicar esto un poco mejor, lo agradecería!


¡Un operador lógico NOT ! convierte un valor en booleano que es lo contrario de su valor lógico.

¡El segundo ! convierte el resultado booleano anterior a la representación booleana de su valor lógico original.

De estos documentos para el operador lógico NOT:

Devuelve falso si su único operando se puede convertir a verdadero; de lo contrario, devuelve verdadero.

Entonces, si getContext te da un valor de "falsey", el !! hará que devuelva el valor booleano false . De lo contrario, volverá true .

Los valores de "falsey" son:

  • false
  • NaN
  • undefined
  • null
  • "" (cadena vacía)
  • 0

El uso de la variable le ofrece una garantía de typecast a boolean.

Para darte un ejemplo simple:

"" == false (is true) "" === false (is false) !!"" == false (is true) !!"" === false (is true)

Pero no tiene sentido usarlo si estás haciendo algo como:

var a = ""; // or a = null; or a = undefined ... if(!!a){ ...

El if lo convertirá en booleano, por lo que no es necesario realizar el lanzamiento doble negativo implícito.


En javascript, usar el operador "bang" (!) Devolverá true si el valor dado es verdadero, 1, no nulo, etc. Devolverá falso si el valor es indefinido, nulo, 0 o una cadena vacía.

Entonces, el operador de bang siempre devolverá un valor booleano, pero representará el valor opuesto al que comenzó. Si toma el resultado de esa operación y la "golpea" de nuevo, puede revertirla nuevamente, pero aún así terminar con un booleano (y no indefinido, nulo, etc.).

Usar el bang dos veces tomará un valor que podría haber sido indefinido, nulo, etc., y lo hará simplemente false . Tomará un valor que podría haber sido 1, "verdadero", etc. y lo hará simplemente true .

El código podría haber sido escrito:

var context = document.createElement(''canvas'').getContext; var contextDoesNotExist = !context; var contextExists = !contextDoesNotExist; return contextExists;


Javascript tiene un conjunto confuso de reglas para lo que se considera "verdadero" y "falso" cuando se coloca en un contexto donde se espera un booleano. Pero el operador lógico-NO,! , siempre produce un valor booleano adecuado (una de las constantes true y false ). Al encadenar dos de ellos, la expresión idiomática produce un booleano adecuado con la misma veracidad que la expresión original.

¿Por qué te molestarías? Porque hace que funciones como la que demuestre sean más predecibles. Si no tiene el doble negativo allí, puede devolver undefined , un objeto Function o algo no muy distinto a un objeto Function . Si la persona que llama de esta función hace algo extraño con el valor de retorno, el código general podría portarse mal ("raro" aquí significa "cualquier cosa menos una operación que aplica el contexto booleano"). El idioma doblemente negativo lo impide.


Si document.createElement(''canvas'').getContext no está undefined o null , devolverá true . De lo contrario, devolverá false .


Tiene que ver con la tipificación débil de JavaScript. document.createElement(''canvas'').getContext es un objeto de función. ¡Prepensando uno solo ! lo evalúa como una expresión booleana y voltea la respuesta. Al anteponer a otro ! , voltea la respuesta. El resultado final es que la función lo evalúa como una expresión booleana, pero devuelve un resultado booleano real en lugar del objeto función mismo. !! Preámbulo !! es una manera rápida y sucia de encasillar una expresión a un tipo booleano.


! arroja "algo" / "cualquier cosa" a un boolean .

!! devuelve el valor booleano original (y garantiza que la expresión es ahora booleana, independientemente de lo que era antes)


document.createElement(''canvas'').getContext puede evaluar como undefined o una referencia de objeto. !undefined produce true ![some_object] produce false . Esto es casi lo que necesitamos, solo invertido. Entonces !! sirve para convertir undefined a false y una referencia de objeto a true .