Command Palette

Search for a command to run...

Coerción de Tipos en JavaScript: Implícita vs Explícita

Entiende cómo JavaScript convierte automáticamente entre tipos de datos, por qué causa bugs sutiles, y cómo manejarla correctamente en tu código.

Lectura: 14 min
Nivel: Intermedio

TL;DR - Resumen rápido

  • Coerción es la conversión automática o manual entre tipos de datos en JavaScript
  • Coerción implícita ocurre automáticamente cuando JavaScript convierte tipos sin que lo pidas
  • Coerción explícita es cuando tú conviertes tipos manualmente con funciones como String(), Number() o Boolean()
  • El operador + convierte a string si hay un string, pero -, *, / siempre convierten a número
  • Valores falsy (false, 0, '', null, undefined, NaN) se convierten a false en contextos booleanos
  • Comparación con == hace coerción automática, === no hace coerción (más seguro)
  • La coerción implícita causa muchos bugs sutiles - usa coerción explícita para código claro

¿Qué es la Coerción de Tipos?

La coerción de tipos (type coercion) es el proceso de convertir un valor de un tipo de dato a otro tipo. JavaScript es un lenguaje con tipos dinámicos y débiles, lo que significa que puede convertir automáticamente tipos en muchas situaciones - esto se llama coerción implícita. También puedes convertir tipos manualmente con funciones como String(), Number() o Boolean() - eso es coerción explícita. Entender la coerción es crítico porque causa bugs muy sutiles.

La coerción ocurre constantemente en JavaScript: cuando sumas un número con un string, cuando comparas valores con ==, cuando usas if con valores no-booleanos, etc. JavaScript fue diseñado para ser amigable y perdonar errores, permitiendo código como "Total: $" + precio sin conversión manual. Sin embargo, esta flexibilidad viene con un costo: comportamientos inesperados cuando las conversiones no son lo que esperabas.

coercion-ejemplos-basicos.js
Loading code...

Estos ejemplos muestran coerción implícita en acción. JavaScript convierte automáticamente 5 a string cuando lo sumas con "5" (resultado: "55"), convierte "10" a número cuando lo restas, y convierte "abc" a true en la condición if. Este comportamiento es poderoso pero peligroso - puede causar bugs difíciles de detectar si no entiendes las reglas exactas.

Coerción Implícita: Conversión Automática

La coerción implícita ocurre cuando JavaScript convierte automáticamente un tipo a otro sin que lo pidas explícitamente. Esto sucede en operaciones matemáticas, concatenación de strings, comparaciones con ==, y contextos booleanos como condiciones if u operadores lógicos (&&, ||, !). JavaScript tiene reglas específicas para cada tipo de conversión, pero no siempre son intuitivas.

Coerción a String

La coerción a string ocurre principalmente con el operador + cuando uno de los operandos es un string. JavaScript convierte el otro operando a string y concatena. Números, booleanos, null,undefined, y objetos se convierten usando sus métodos toString() o la función String().

coercion-a-string.js
Loading code...

Cuando usas + con un string, JavaScript convierte todo a string y concatena. Los números se convierten a su representación decimal, los booleanos a "true"/"false", null a "null",undefined a "undefined". Los objetos llaman su método toString() que por defecto retorna"[object Object]". Los arrays se convierten a strings separados por comas.

Objetos a String: Casi Siempre Inútil

Convertir objetos a string con + casi nunca es lo que quieres: { a: 1 } + "" da"[object Object]", que no es útil. Si necesitas representar un objeto como string, usa JSON.stringify(obj). Los arrays son la excepción: [1, 2, 3] + "" da "1,2,3", que puede ser útil en algunos casos.

Coerción a Number

La coerción a número ocurre con operadores matemáticos (-, *, /, %), comparaciones numéricas, y el operador unario +. JavaScript intenta convertir strings a números parseando su contenido, los booleanos a 0/1, null a 0, undefined a NaN, y objetos usandovalueOf() o toString().

coercion-a-number.js
Loading code...

Los operadores matemáticos (excepto +) convierten a número. Strings numéricos se parsean, strings no-numéricos producen NaN. true es 1, false es 0, null es 0, undefined es NaN. El operador unario + convierte a número sin hacer operación matemática. Esta es la fuente de muchos bugs cuando strings no-numéricos producen NaN silenciosamente sin lanzar errores.

NaN: El Resultado de Conversiones Fallidas

NaN (Not a Number) es el resultado cuando intentas convertir algo a número y falla. Importante: NaN no es igual a nada, ni siquiera a sí mismo (NaN === NaN es false). Para verificar si un valor es NaN, usa Number.isNaN(valor). La coerción a número falla silenciosamente produciendo NaN, sin lanzar errores, lo que hace los bugs difíciles de detectar.

Coerción a Boolean (Falsy y Truthy)

La coerción a boolean ocurre en contextos booleanos: condiciones if, operadores lógicos (&&, ||, !), y el operador ternario. JavaScript tiene exactamente 7 valores falsy que se convierten a false. Todo lo demás es truthy y se convierte a true:

  • <code>false</code> — el booleano false
  • <code>0</code> y <code>-0</code> — cero y cero negativo
  • <code>""</code> o <code>''</code> — el string vacío
  • <code>null</code> — ausencia intencional de valor
  • <code>undefined</code> — variable no inicializada
  • <code>NaN</code> — resultado de conversión numérica fallida
coercion-a-boolean.js
Loading code...

Solo hay 7 valores falsy en JavaScript — memorízalos. Todo lo demás es truthy, incluyendo valores que podrían parecer "vacíos": arrays vacíos [], objetos vacíos {}, el string"0", el string "false". Este comportamiento causa bugs comunes cuando verificas si un array tiene elementos con un if simple. Verifica explícitamente en lugar de confiar en coerción.

Arrays y Objetos Vacíos Son Truthy

Uno de los errores más comunes: [] y {} son truthy aunque estén vacíos —if ([]) e if ({}) ejecutan su bloque. Para verificar si un array tiene elementos usa arr.length !== 0, y para verificar si un objeto tiene propiedades usaObject.keys(obj).length !== 0. No confíes en coerción booleana para estas verificaciones.

Coerción Explícita: Conversión Manual

La coerción explícita es cuando tú conviertes tipos manualmente usando funciones de conversión. Es más clara, predecible, y fácil de mantener que la coerción implícita. Las funciones principales son String(), Number(), y Boolean(). También existen parseInt() y parseFloat() para strings numéricos con mejor control sobre el parseo.

coercion-explicita.js
Loading code...

Usa String(), Number(), y Boolean() para conversión explícita. Son más claras que trucos implícitos como + "" o !!. parseInt() y parseFloat() son útiles para strings con texto al final: "10px" da 10 con parseInt() pero NaN con Number(). Siempre pasa la base a parseInt(): usa parseInt(str, 10) para forzar interpretación decimal y evitar sorpresas.

Conversión Explícita Es Mejor Práctica

Siempre prefiere coerción explícita sobre implícita. String(valor), Number(valor), Boolean(valor) son claros y predecibles. Evita trucos como + "", +valor, !!valor — son menos legibles y confunden a quienes leen el código. El código explícito es más fácil de mantener y tiene menos bugs. La brevedad no vale la pena si sacrifica claridad.

El Operador + y Sus Sorpresas

El operador + es especial porque hace dos cosas: suma numérica y concatenación de strings. Si ALGUNO de los operandos es string, hace concatenación (convierte todo a string). Si ambos son números, suma. Los otros operadores (-, *, /, %) siempre convierten a número. Esta ambigüedad del + causa muchos bugs, especialmente con inputs de usuario.

operador-mas.js
Loading code...

El operador + prefiere concatenación sobre suma: si hay UN string, convierte todo a string. Esto causa el bug clásico donde "2" + 2 da "22" en lugar de 4. El orden importa:1 + 2 + "3" evalúa izquierda a derecha, dando "33". Los inputs HTML son siempre strings: si sumas directamente dos inputs obtienes concatenación ("10" + "20" = "1020"). Siempre convierte con Number(input) antes de operaciones matemáticas con valores de usuario.

Coerción en Comparaciones

Las comparaciones en JavaScript tienen dos modos: comparación suelta (==, !=) que hace coerción de tipos, y comparación estricta (===, !==) que NO hace coerción. La comparación suelta tiene reglas complejas y contraintuitivas. La mejor práctica es siempre usar === y!== para evitar bugs de coerción.

comparaciones-coercion.js
Loading code...

El operador == hace coerción de tipos con reglas complejas: convierte strings a números, convierte booleanos a números (true es 1, false es 0), null == undefined pero no son== a otros valores. Estas reglas causan comportamientos sorprendentes como "0" == false siendo true. El operador === compara sin coerción - más predecible y seguro. Los operadores relacionales (<, >) también hacen coerción a número.

Siempre Usa === en Lugar de ==

La mejor práctica en JavaScript moderno es nunca usar == o !=. Usa === y !== siempre. Son más rápidos (sin coerción), más predecibles, y previenen bugs sutiles. La única excepción aceptable es verificar null/undefined: value == null verifica ambos a la vez, perovalue === null || value === undefined es más explícito y preferible.

Casos Problemáticos y Bugs Comunes

La coerción implícita causa muchos bugs en código real, especialmente cuando combinas tipos de formas inesperadas. Estos casos problemáticos son fuente de errores sutiles que pasan tests pero fallan en producción con datos reales. Entender estos casos te ayuda a escribir código más robusto.

casos-problematicos.js
Loading code...

Los casos problemáticos incluyen: arrays convirtiéndose a strings o números de formas raras ([] + 10 da "10" pero +[] da 0), objetos siendo "[object Object]" en concatenación,NaN no siendo igual a sí mismo (NaN === NaN es false), y null >= 0 siendo true a pesar de que null == 0 sea false. La solución es siempre usar conversión explícita y === en lugar de ==.

Resumen: Coerción de Tipos

Conceptos clave:

  • Coerción implícita: JavaScript convierte tipos automáticamente
  • Coerción explícita: tú conviertes tipos con String(), Number(), Boolean()
  • Operador + concatena si hay string, otros operadores convierten a número
  • 7 valores falsy: false, 0, -0, '', null, undefined, NaN
  • == hace coerción de tipos, === no hace coerción (más seguro)

Mejores prácticas:

  • Usa conversión explícita (String/Number/Boolean) en lugar de implícita
  • Siempre usa === y !== en lugar de == y !=
  • Convierte inputs de usuario a número antes de operaciones matemáticas
  • Verifica tipos explícitamente en lugar de confiar en coerción booleana
  • Usa Number.isNaN() para verificar NaN, nunca === NaN