Cuál es el !! ¿Operador (no no) en JavaScript?
Vi este código:
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
Parece estar utilizándose !!
como operador, lo cual no reconozco. ¿Qué hace?
Se convierte Object
a boolean
. Si fuera falso (p. ej., 0
, null
, undefined
etc.), 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
Es una forma terriblemente oscura de realizar una conversión de tipos.
!
significa NO . Así !true
es false
y !false
es true
. !0
es true
y !1
es 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 userId
es []
, por ejemplo) debido a la forma en que !=
funciona el operador y qué valores se consideran verdaderos .
!!expr
(dos !
operadores seguidos de una expresión) devuelve la veracidad de la expresión como true
o false
.
Tiene sentido cuando se usa en expresiones no booleanas. Algunos ejemplos:
Nota: la Boolean
funció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