Javascript Avanzado IX

🔢 ToNumber, Truthy y Falsy: cuando JS convierte todo por vos (¿para bien o para mal?) Ya vimos cómo JavaScript convierte cosas a string. Pero también necesita convertir valores a number y boolean dependiendo del contexto. En este post nos metemos con ToNumber y Truthiness: los dos pilares del “comportamiento…

🔢 ToNumber, Truthy y Falsy: cuando JS convierte todo por vos (¿para bien o para mal?)

Ya vimos cómo JavaScript convierte cosas a string. Pero también necesita convertir valores a number y boolean dependiendo del contexto. En este post nos metemos con ToNumber y Truthiness: los dos pilares del “comportamiento mágico” del lenguaje.


💡 ToNumber Abstract Operation

Cuando un valor no-numérico necesita ser usado como número (por ejemplo, en operaciones aritméticas), entra en juego la operación abstracta ToNumber, definida en la especificación (sección 7.1.3).

La lógica es más compleja de lo que parece. Un ejemplo bizarro:

Number({
  valueOf() { return "42"; },
  toString() { return "3"; }
}); // 42

¿Por qué? Porque el motor intenta primero con valueOf() (si el tipo esperado es primitivo), y si eso no da resultado numérico, recurre a toString().

🧠 Regla general (simplificada):

  1. Si ya es un número, no se convierte.
  2. undefinedNaN
  3. null0
  4. true1; false0
  5. string → se intenta parsear como número
  6. object → se convierte a primitivo y luego a número (puede devolver NaN)

🔁 Truthy y Falsy: ¿qué es verdadero en JS?

Una gran fuente de confusión para principiantes es el sistema de truthy/falsy. En JavaScript, no todos los valores son tratados como verdaderos en un contexto booleano.

Falsy: valores que se comportan como false en evaluaciones booleanas.

Truthy: todos los demás.

Valores falsy en JS (hay solo 7):

false
0
-0
0n
""
null
undefined
NaN

Todo lo demás es truthy. Incluso cosas como:

"false"
[]
{}
function(){}

⚠️ Cuidado con los falsos falsy

let x = new Boolean(false);
if (x) {
  console.log("¡Esto es true!");
}

new Boolean(false) crea un objeto truthy, aunque su valor interno sea false. Este tipo de objetos “parecen” falsy pero no lo son. ¡Gran fuente de bugs!

Lo mismo ocurre con new String(""), new Number(0), etc.

Boolean(""); // false
Boolean(new String("")); // true ❗

🔒 Regla de oro: no uses new Boolean(), new Number(), new String(). Preferí los tipos primitivos.


📚 Ejemplo práctico

let vals = ["", 0, null, undefined, NaN, [], {}, "false", function(){}];

vals.forEach(v => {
  console.log(Boolean(v), typeof v, v);
});

Esto te dará una visión clara de qué considera JavaScript como “true” y qué no.


📌 En resumen

  • ✔️ ToNumber convierte valores no numéricos de forma compleja.
  • ❗ Objetos que parecen falsy no lo son. Evitá usar wrappers como new Boolean().
  • 🔍 Evaluá los valores con Boolean(valor) si tenés dudas.
  • 📏 No confíes solo en lo que “parece”. Testealo.

🔗 Recursos útiles

+

Deja un comentario