variable traduccion que ejemplo booleanos booleana javascript language-design

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:

  1. Deje que expr sea ​​el resultado de evaluar UnaryExpression .

  2. Deje oldValue ser ToBoolean(GetValue(expr)) .

  3. Si oldValue es true , devuelve false .

  4. 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"