Cuál es el !! ¿Operador (no no) en JavaScript?

Resuelto Hexagon Theory asked hace 15 años • 36 respuestas

Vi este código:

this.vertical = vertical !== undefined ? !!vertical : this.vertical;

Parece estar utilizándose !!como operador, lo cual no reconozco. ¿Qué hace?

Hexagon Theory avatar Apr 24 '09 15:04 Hexagon Theory
Aceptado

Se convierte Objecta boolean. Si fuera falso (p. ej., 0, null, undefinedetc.), sería false, en caso contrario, true.

!object  // Inverted Boolean
!!object // Noninverted Boolean, so true Boolean representation

Entonces !!no es un operador; es solo el !operador dos veces.

Generalmente es más sencillo de hacer:

Boolean(object) // Boolean

Ejemplo del mundo real "Prueba la versión de IE":

const isIE8 = !! navigator.userAgent.match(/MSIE 8.0/);
console.log(isIE8); // Returns true or false

Si tu ⇒

console.log(navigator.userAgent.match(/MSIE 8.0/));
// Returns either an Array or null

Pero si tu ⇒

console.log(!!navigator.userAgent.match(/MSIE 8.0/));
// Returns either true or false
stevehipwell avatar Apr 24 '2009 08:04 stevehipwell

Es una forma terriblemente oscura de realizar una conversión de tipos.

!significa NO . Así !truees falsey !falsees true. !0es truey !1es false.

Entonces estás convirtiendo un valor en a Boolean, invirtiéndolo y luego invirtiéndolo nuevamente.

    // Maximum Obscurity:
    val.enabled = !!userId;

    // Partial Obscurity:
    val.enabled = (userId != 0) ? true : false;

    // And finally, much easier to understand:
    val.enabled = (userId != 0);

    // Or just
    val.enabled = Boolean(userId);

Nota: las dos expresiones del medio no son exactamente equivalentes a la primera expresión cuando se trata de algunos casos extremos (cuando userIdes [], por ejemplo) debido a la forma en que !=funciona el operador y qué valores se consideran verdaderos .

Tom Ritter avatar Sep 10 '2009 17:09 Tom Ritter

!!expr(dos !operadores seguidos de una expresión) devuelve la veracidad de la expresión como trueo false.

Tiene sentido cuando se usa en expresiones no booleanas. Algunos ejemplos:

Nota: la Booleanfunción produce exactamente los mismos resultados y es más legible.

          !!false // false
           !!true // true

              !!0 // false
!!parseInt("foo") // false — NaN is falsy
              !!1 // true
             !!-1 // true  — negative number is truthy
          !!(1/0) // true  — Infinity is truthy

             !!"" // false — empty string is falsy
          !!"foo" // true  — non-empty string is truthy
        !!"false" // true  — ...even if it contains a falsy value

     !!window.foo // false — undefined value is falsy
      !!undefined // false — undefined primitive is falsy
           !!null // false — null is falsy

             !!{} // true  — an (empty) object is truthy
             !![] // true  — an (empty) array is truthy
Salman A avatar May 15 '2012 09:05 Salman A