logo blog voltadev
Type Coercion

Type Coercion

- views - 11-20-2021

Según MDN, la coerción es la conversión automática o implicita de valores de un tipo de dato a otro.
Ejemplo: de cadena de texto a número. JavaScript es de tipado dinámico “Duck typing” a diferencia de otros lenguajes como C# o Java que son “static typed” o de tipos estáticos.

En el estilo de tipificación Duck typing no es necesario especificar el tipo de dato para las variables ya que el tipo está asociado al valor, esto es una gran ventaja ya que podemos cambiar su valor sin ningún problema.



Hay que tener en cuenta la siguientes reglas

  • ✔️ objects evaluados como true
  • ✔️ undefined evaluado como false
  • ✔️ null evaluado como false
  • ✔️ booleans evalúa el valor del booleano
  • ✔️ numbers evalúa false si es +0, -0, o NaN, para los demás true
  • ✔️ strings evalúa false si un string está vacío ‘’, para los demás true

1- Introducción a la Coerción

Si ejecutas el siguiente código en la consola del navegador la salida nos muestra true

0 == "0"; //true

  1. El primer 0 es de type number
  2. El segundo 0 es de type "string"

Nunca deberían ser true, en la mayoria de lenguajes se respeta eso Por ejemplo en JAVA retorna este mensaje:

error: incomparable types: int and String esto tiene mucho sentido. Si deseas comparar un int y String en Java, primero debe convertirlos al mismo tipo.


🚧 "Cuando JS compara dos valores a través de ==, uno de los valores puede sufrir coerción"


Coerción: cambia automáticamente un valor de un tipo a otro.

🛑Esto conviene si lo estas aplicando a proposito, pero es potencialmente dañino si no conoces sus implicaciones

¡El segundo valor 0 se convirtió en un número! entonces si 0 es igual a 0, es true Extraño, ¿verdad? bueno acostúmbrate.

👉 Secretamente el 0 en string se convirtió a número - type number

2- Las matrices también hacen coerción

0 == []; // true

🤔 ¿Qué ha pasado ?

👉 Coerción de nuevo


  1. Si los arrays son objects
  2. El array vacío se convierte en un string vacío

Nuevamente, de acuerdo con la especificación, JS primero busca el método toString de un objeto para coaccionarlo.

[1, 2, 3].toString()

[("hello", "world")].toString(); // "hello,world"

Dado que nuestra matriz está vacía, ¡no tenemos nada a que unirnos! por lo tanto...

[].toString(); // ""

👉 Un array vacío hace coerción para un string vacío


"ToPrimitive de la especificación convierte a esta matriz vacía en una cadena vacía"


  1. El string vacío luego se convierte en 0

No puedes inventar estas cosas. Ahora que hemos aplicado coerción a la matriz a "", volvemos al primer algoritmo

Dado que 0 es Número y "" es Cadena, devuelve 0 == ToNumber ("")

ToNumber("") retona 0.

//Por lo tanto,
0 == 0 //una vez más es true

3- Resumen rápido

Esto es true

0 == "0"; // true

👉 Porque la coerción convierte esto a number

0 == []; // true

👉 Porque la coerción corre 2 veces:

👉 ToPrimitive ([])// "" da una cadena vacía

👉 2- Entonces ToNumber ("") da 0



¡FALSO! Correcto. Esta parte tiene sentido si entendiste las reglas.

"0" == []; // false

Si x es String o Number, y es Object, devuelve x == ToPrimitive (y)

Eso significa...


Como "0" es String y [] es Object, devuelve x == ToPrimitive ([])

"0" == ""

Son cadenas, por lo que JavaScript dice que no se necesita más coerción. Es por eso que nos devuelve false.

conclusión:

"0" == "" // false
"0" == [] //false

JavaScript devuelve falso


  • ✔️ cero "string" no es igual a un string vacío
  • ✔️ cero "string" no es igual a un array vacío
  • 👀 No puedes hacer ceorción si tu ocupas === triple igual

JavaScript es raro 😄

si quires aprender más sobre el lenguaje y coerción te recomiendo el siguiente link jsisweird


meme js

¡Muchas gracias por tu lectura dejo el link de cafecito apoyo voluntario, tu contribución me motiva a seguir creando contenido de alta calidad. ¡Muchas gracias por tu apoyo!


Buy Me a Coffee at ko-fi.com