traduccion - ¿Por qué! New Boolean(false) es igual a false en JavaScript?
string to boolean javascript (2)
De la documentación de jQuery sobre tipos de JavaScript viene este fragmento de código que describe el comportamiento de las cadenas cuando se convierte en booleanos (ese tema no está relacionado con esta pregunta, pero es justo donde encontré el código):
!"" // true
!"hello" // false
!"true" // false
!new Boolean(false) // false
Obtengo los primeros tres ejemplos, pero no obtengo el último ejemplo, porque:
new Boolean(false) == false //true
!false // true
Entonces yo asumiría:
!new Boolean(false) // true
Pero en lugar:
!new Boolean(false) // false, mind = blown
¿Qué es esto? Ni siquiera ...
Es porque:
new Boolean(false) === false // false
Si es así, ¿para qué sirve esto?
Porque el new Boolean
devuelve un objeto como se indica aquí .
El !
se define de la siguiente manera :
11.4.9 operador lógico NO (
!
)La producción UnaryExpression:! UnaryExpression se evalúa de la siguiente manera:
Deje que expr sea el resultado de evaluar UnaryExpression .
Deje oldValue ser
ToBoolean(GetValue(expr))
.Si oldValue es
true
, devuelvefalse
.Devuelve
true
.
and :
9.2 ToBoolean
La operación abstracta ToBoolean convierte su argumento a un valor de tipo Booleano de acuerdo con la Tabla 11:
Tabla 11 - Conversiones de ToBoolean
Tipo de argumento: resultado
...
Objeto -
true
Entonces, es un objeto, ¡así que ToBoolean
vuelve true
, por lo tanto !
devuelve false
.
new Boolean(false)
devuelve un objeto que no es nulo. Los objetos no nulos son siempre verdad.
Como resultado !
de cualquier objeto no nulo siempre será falso.
Para demostrarlo a usted mismo, puede ejecutar esto en su consola de JavaScript
(typeof new Boolean(false)) //"object"
Además, puede usar el operador de strict equality
para confirmar que el new Boolean(false)
no es realmente false
:
new Boolean(false) === false // false
Por cierto, llamar a la función Boolean
como una función, sin la nueva, en realidad devuelve una primitiva
!Boolean(false) // true
(typeof Boolean(false)) //"boolean"