Por qué el valor booleano de indefinido es falso, pero cuando se
compara con false da que son diferentes?
Tocando el tema de datos booleanos conocemos que su representación lógica es la siguiente:
True que en representación binaria es igual a 1
False que en representacón binaria es igual a 0
Por lo que queda claro que el tipo de dato booleano posee una estructura predefinida y un valor especifico asignado por defecto en javascript
Que sucede con undefined?
Es un tipo de dato también (primitivo especial), sin embargo, no posee valor asignado por defecto en el lenguaje. Es utilizado para especificar o reservar un espacio en memoria al cual no se le ha asignado valor alguno.
Es por ello que
console.log(undefined == false)
no retorna true
False puede ser tomado como 0
, sin embargo, no es así con undefined porque no posee representación numérica en términos de valor asignado, de allí el hecho de que sea un primitivo especial porque genera ciertas excepciones en el comportamiento estandar del lenguaje. Yo podría declarar una variable:
var x;
Aún cuando existe x
, tiene un espacio reservado en memoria y podría hacer operaciones con ella luego... lo que sucede con la instrucción anterior es que reserva el espacio en memoria para x
pero no está definida (es undefined), es decir, no tiene representación lógica y es por ello:
console.log(x == false)
tampoco arrojará true
Claro que la conversión de tipos de javascript maneja este tipo de excepciones si realizas una comparación estricta de tipo lógica:
console.log(Boolean(undefined) == false)
si arrojará true
Arrojará true porque estás obligando a que undefined tome un valor lógico o booleano y el comportamiento por defecto al declararlo un booleano siempre será false salvo tu mismo indiques que no sea así.
Para más información puedes visitar: undefined-javacript también puedes leer null vs undefined
Por qué si el operador de igualdad trata de convertir los tipos, con
undefined no pasa lo mismo?
Precisamente porque el objetivo de undefined es poder declarar una variable (por ejemplo) sin que necesariamente se sepa cuál es su tipo. Es por ello que javascript maneja esta especie de excepción a su regla de conversión de tipos indirecta.
Distinto es comparar el booleano de undefined con false:
console.log(Boolean(undefined) == false)
Con la instrucción anterior estás forzando a una conversión automática de tipos de manera directa así que javascript por defecto "asigna" el valor false en la conversión y false==false
como resultado es true.
Espero sea de ayuda. Un saludo!