La coerción de datos es uno de los aspectos más intrigantes de Javascript. Al corresponderse con un lenguaje de tipado blando, no es necesario especificar el tipo de datos que contendrán nuestras variables. Esto hace posible que en tiempo de ejecución, podamos modificar dicho tipo para operar con ellos a voluntad.
Por lo general, es el intérprete de Javascript el que realiza la conversión de tipos por nosotros de forma interna buscando adaptarse a nuestras operaciones.
Por ejemplo, echemos un vistazo al siguiente código:
var a = "1", b = 5; console.log( typeof a, typeof b); // string number console.log( a + b ); // 15
El resultado puede no ser el esperado: intérnamente, Javascript realiza la conversión del número a cadena y concatena los operandos.
Pero esto es asà porque el operador + es a la vez concatenador y suma, prevaleciendo la primera de sus funciones cuando la situación lo permite.
Cuando utilizamos el operador de resta, la cosa cambia:
console.log( "2" - 2 ); // 0
En este caso, la coerción se realiza desde la cadena al número para permitir la operación. Con la multiplicación y la división, ocurre igual:
console.log( '10' * 3 ); // 30 console.log( '10' / 2 ); // 5
Otro ejemplo interesante es cuando involucramos valores lógicos:
console.log( true + true ) // 2
El valor devuelto es el resultado de la suma cuyos operandos corresponden con la conversión de los operadores booleanos a su entidad numérica ( true === 1 ). De nuevo, el intérprete realiza la coerción por nosotros en segundo plano.
De ahà se deduce que,
console.log( '1' + true ); // 1true console.log( '10' - true ); // 9
Más coerción!
Los resultados hay que reconocer que pueden resultar, cuanto menos, desconcertantes. La siguiente tabla con diversas curiosidades derivadas de la coerción ha sido elaborada por Angus Crall:
true == 1; //true! (converts true to bit value 1) true - false === 1 //true!!! "2" + 2; //22! "2" - 2; //0 "2" - - 2; //4 NaN == NaN; //false - this one sort of makes sense since NaN is any non-Number cast to a number NaN NaN; //false - whatever! "" == 0 //true undefined == null //false! "0" == 0 //true! "false" == false //false!!!' '\t\r\n ' == 0 //true!!! - essentially an empty string which coerces to 0
NOTA: Algunos de las comprobaciones anteriores no pueden realizarse desde la consola de Firebug ya que arrojan errores de sintaxis. Realmente, se trata de un problema de Firebug para ejecutar algunas instrucciones de este tipo.
Con los condicionales, la situación es similar:
if (0) {....} //false if(-1) {....} //true if("") {....} //false if("null") {....} //true
Forzando la coerción
Como otros lenguajes no tipado, Javascript permite realizar una conversión explÃcita de los tipos de datos mediante funciones nativas como parseInt, parseFloat, etc…
Es posible realizar la conversión entre casi todos los tipos existentes. La siguiente tabla (vista aquÃ) nos muestra cómo conseguir cada una de estas conversiones:
| From | To | Use this |
|---|---|---|
| string | boolean | !!x |
| string | number | x – 0 |
| string | object | new String(x) |
| boolean | string | ” + x |
| boolean | number | x – 0 |
| boolean | object | new Boolean(x) |
| number | string | ” + x |
| number | boolean | !!x |
| number | object | new Number(x) |
| object | string | x.toString() |
| object | boolean | !!x -or- !!x.toString() |
| object | number | (!!x) – 0 -or- x.toString() – 0 |
Conclusión
La coerción de datos puede ser algo realmente poco intuitivo y capaz de generar los errores más difÃciles de rastrear. Conocer algunas de las conversiones que realiza el intérprete Javascript en segundo plano puede ayudarnos a evitar estos comportamiento no deseados en el tratamiento de nuestros datos.
Además de la conversión automática, disponemos de operadores lógicos y unarios que pueden ayudarnos a pasar de un tipo de dato a otro según necesitemos, algo que en muchas ocasiones, no resulta tan sencillo como debiera.

Hola,
Para el primer ejemplo, en que se suma (string + number), también es posible convertir el string a number anteponiendo + al string: console.log( +a + b ); // 6
Saludos
Correcto Leandro;
en la tabla encontramos alguna formas más de convertir cadenas a números.
Sin embargo, los test de rendimiento demuestran que el operador + es incluso más rápido que un parseInt a la hora de realizar la conversión, por lo que suele ser mi opción favorita.
Saludos!
Cuanto más aprendo de JavaScript más me gusta Pascal. En serio. Incluso estoy pensando en que se mi lenguaje más odiado, superando a PHP y C++ (y he dicho C++, no C).
Por cierto, ¿la siguiente lÃnea es legal, o es una errata?
“false” = false //false!!!
¿Cómo narices puede asignarse una constante de cadena?
Si; efectivamente era una errata. Gracias!
Javascript es un lenguaje que puede despertar reacciones tanto apasionadas como de odio. Solo hay que tomarse el tiempo para entenderlo y ver cómo sacar partido de sus particularidades.
Precisamente, la coerción de tipos, es una herramienta muy potente cuando la utilizamos de forma consciente: ofrece un alto grado de flexibilidad que después se echa de menos en lenguajes de tipado fuerte.
Saludos!
Por alusiones (y sin rencor, ¿eh?
:
Creo que el problema que tengo con JS es porque lo aprendà de textos que lo manejaban como si fuera un lenguaje “procedimental” y “estructurado”, comparándolo excesivamente con C y Java, y claro, parece ser que no es asÃ. Ahora, después de tantos años (empece con JS allá por el noventaytantos) a ver cómo reaprendo y me quito de encima todo ese bagaje prejuicioso…
Y de nada.
¡Hola! Lo primero, agradecerte este trabajazo que haces porque es muy útil y beneficioso para todo aquel que quiere aprender y/o mejorar en programación. Dicho esto, sólo comentar que hay una pequeña errata en el ejemplo:
console.log( ’10′ – true ); // 99
En realidad darÃa 9 (o el ’10′ deberÃa ser un ’100′). Un detalle tonto, pero ante un trabajo tan bueno como el que haces, si veo una errata no puedo ignorarla ¡Deben ser erradicadas! Jajaja (vaya, qué malévolo ha quedado eso…).
¡Un saludo!
Tienes toda la razón Andrés;
ya lo he corregido.
Gracias por el reporte
Un saludo!