¿Qué es la coerción de tipos en JavaScript y cuándo ocurre?
Ver respuesta — intenta responderla en voz alta primero
La coerción es la conversión automática de un tipo de dato a otro que hace JavaScript. Ocurre sobre todo con el operador + (que favorece las cadenas), con las comparaciones == y en contextos que esperan un booleano (if, !, etc.).
JavaScript a veces convierte tipos por su cuenta. Hay dos clases:
- Coerción implícita: JavaScript lo hace automáticamente. Por ejemplo,
"5" + 1da"51"porque convierte el número a cadena. - Coerción explícita: la haces a propósito, con
Number(...),String(...),Boolean(...).
Casos clave:
+con una cadena convierte todo a cadena y concatena.- Los demás operadores matemáticos (
-,*,/) convierten a número. - En un
if, los valores se convierten a booleano. Los valores falsy son:false,0,"",null,undefined,NaN. Todo lo demás es truthy.
// + con una cadena concatena
console.log("5" + 1); // "51" (1 se vuelve "1")
console.log(1 + "5"); // "15"
// otros operadores convierten a número
console.log("5" - 1); // 4 ("5" se vuelve 5)
console.log("5" * 2); // 10
console.log("abc" - 1); // NaN (no se puede convertir)
// coerción a booleano (valores falsy)
if (!"") console.log("la cadena vacía es falsy");
if (!0) console.log("el cero es falsy");
if (!null) console.log("null es falsy");
// coerción explícita (recomendada cuando quieres control)
console.log(Number("42")); // 42
console.log(String(42)); // "42"
console.log(Boolean("")); // false
Confundirse con cómo se comporta +. Muchos juniors esperan que "5" + 1 sea 6, pero es "51" porque + con una cadena concatena en lugar de sumar. En cambio, "5" - 1 sí da 4.
"La coerción es cuando JavaScript convierte automáticamente un tipo en otro. El caso más famoso es el operador
+: si uno de los operandos es una cadena, convierte todo a cadena y concatena, por eso'5' + 1es'51'. Los demás operadores matemáticos convierten a número. También hay coerción a booleano en losif, donde los valores falsy sonfalse,0,'',null,undefinedyNaN. Para evitar sorpresas, prefiero hacer conversiones explícitas conNumber()oString()."
¿Qué imprime esto?
console.log(true + 1);
console.log("10" - "4");
console.log([] + []);
Ver respuesta
2 (true se convierte a 1), 6 (ambas cadenas se convierten a números) y "" (dos arreglos vacíos se convierten a cadenas vacías y se concatenan).