Los Problemas de JavaScript que Aprendimos a Aceptar (Y ES2026 Finalmente los Arregló)
Las fechas, matemáticas, JSON y limpieza siempre fueron frágiles… Asumí que era normal hasta que ES2026 probó que no lo era.
Foto de Vitaly Gariev en Unsplash
¿Recuerdas la última vez que intentaste sumar dos números en JavaScript y obtuviste 0.30000000000000004 en lugar de 0.3? ¿O cuando necesitabas trabajar con fechas y zonas horarias, pasaste tres horas depurando, y luego simplemente importaste Moment.js y lo dejaste así?
Sí, yo también.
Aquí está la cosa: JavaScript ha estado llevando silenciosamente algo de equipaje vergonzoso de los años 90. Pero ES2026 está a punto de soltar el micrófono con características que te harán decir, “espera, ¿JavaScript puede hacer eso AHORA?”
El Objeto Date que Rompió un Millón de Corazones
Hablemos del objeto Date de JavaScript. Es… ¿cómo lo digo amablemente? Es terrible.
Una vez vi a un desarrollador descubrir que new Date(0) y new Date("0") te dan fechas diferentes. La expresión en su cara estaba en algún lugar entre la confusión y la crisis existencial. Esto es porque Date trata el cero como una marca de tiempo pero trata “0” como… honestamente no sé, y tampoco lo sabe JavaScript.
Date Magic
Entra Temporal: El héroe que hemos estado esperando.
Temporal no es solo un reemplazo para Date. Es JavaScript finalmente admitiendo “sí, arruinamos eso” y realmente arreglándolo. Maneja las zonas horarias correctamente. Entiende los calendarios. No te hace querer lanzar tu laptop por la ventana cuando trabajas con duraciones.
Aquí está lo que me sorprendió: Temporal tiene 4,000 pruebas. Para comparar, la mayoría de las características de JavaScript tienen un par de cientos. Así de serios están en hacerlo bien.
// Calcular la duración del vuelo entre zonas horarias
const departure = "2025-06-01T08:30:00-04:00[America/New_York]";
const arrival = "2025-06-01T22:15:00+02:00[Europe/Paris]";
const departureTZ = Temporal.ZonedDateTime.from(departure);
const arrivalTZ = Temporal.ZonedDateTime.from(arrival);
console.log(departureTZ.until(arrivalTZ).toString());
// Salida: "PT9H45M" (9 horas, 45 minutos)
Sin librería. Sin dolor de cabeza. Solo funciona.
Firefox ya ha implementado soporte. Chrome está programado para enero de 2026. La pesadilla de las fechas finalmente está terminando.
Matemáticas que Realmente Tienen Sentido
¿Sabes qué es divertido? Intentar sumar una lista de números de punto flotante en JavaScript.
Solo bromeaba. No es divertido en absoluto.
Vi a un desarrollador junior escribir una calculadora de presupuesto una vez. Sumaron los gastos perfectamente en su bucle. Las matemáticas se veían impecables. Pero la precisión de punto flotante de JavaScript convirtió $100.50 en $100.49999999999997.
La aplicación de presupuesto del usuario les dijo que estaban 3 centavos fuera. No lo estaban. JavaScript simplemente estaba siendo JavaScript.
ES2026 trae Math.sumPrecise un método que realmente suma números correctamente. Utiliza un algoritmo más lento pero más preciso que maneja la precisión de punto flotante correctamente. Sí, es más lento que la suma regular. Pero cuando la precisión importa más que la velocidad (presupuestos, cálculos financieros, datos científicos), ese es un compromiso que harás con gusto.
Antes de ES2026:
let total = 0;
prices.forEach(price => total += price);
// Espera lo mejor, prepárate para decimales raros
Con ES2026:
const total = Math.sumPrecise(prices);
// Realmente correcto
Simple. Confiable. Lo que las matemáticas deberían haber sido desde el principio.
El Problema de Limpieza que No Sabías que Tenías
Imagina esto: Abres una conexión a la base de datos. Ejecutas algunas consultas. Tu código lanza un error a mitad de camino.
¿Recuerdaste cerrar esa conexión? ¿Realmente se cerró, o está ahí sentada, consumiendo recursos como una pestaña de Netflix olvidada?
La mayoría de los desarrolladores resuelven esto con bloques try-finally. Adquieres el recurso arriba, te desplazas 200 líneas hacia abajo, y esperas recordar limpiarlo en el bloque finally. Funciona, pero es desordenado y propenso a errores.
ES2026 introduce bloques using limpieza automática de recursos que realmente tiene sentido:
{
using connection = new DatabaseConnection("myDB");
connection.query("SELECT * FROM users");
// ¡Boom! Error lanzado aquí
} // La conexión se cierra automáticamente, incluso con el error
Sin try-finally. Sin olvidar. La limpieza ocurre automáticamente cuando el bloque de código termina, ya sea que se complete normalmente o falle espectacularmente.
Pregunté al ingeniero de Bloomberg Ashley Claymore sobre esto. Ella dijo: “Ves que se requiere un recurso, y esperas que se limpie, y te desplazas y te desplazas hasta que encuentras el bloque finally… Ahora lo obtienes gratis.”
Esto es especialmente crucial para cosas como conexiones de base de datos con límites estrictos. Tu recolector de basura no sabe que tu base de datos solo permite 256 conexiones. Permitirá que tu código pierda conexiones hasta que todo se rompa. Los bloques using arreglan eso.
Base64 Sin la Hinchazón de Librerías
Aquí hay uno raro: JavaScript tiene matrices para datos binarios (Uint8Array), pero no hay una forma integrada de codificarlas como base64.
¿Necesitas manejar claves SSH? ¿Incrustar una pequeña imagen? Recurrirías a una librería.
Con ES2026, simplemente:
const encoded = myData.toBase64();
const decoded = Uint8Array.fromBase64(encodedString);
Listo. Sin instalar NPM, sin preguntarte si la librería aún se mantiene, sin agregar 50KB a tu paquete por dos funciones.
El Problema de JSON con el que Has Estado Viviendo
JSON.parse es excelente hasta que no lo es.
Analiza un número como 999999999999999999 y JavaScript lo redondea a 1000000000000000000. Analiza una fecha y agrega segundos vacíos raros. Intenta analizar un BigInt y JavaScript simplemente se niega.
¿Por qué? Porque JSON tiene precisión arbitraria y JavaScript no. La conversión es con pérdida.
El Texto Fuente de JSON.parse de ES2026 te permite obtener el JSON sin procesar y manejarlo como quieras:
const parsed = JSON.parse(jsonString, (key, value, context) => {
if (key === 'bigNumber') {
return BigInt(context.source); // Usa la fuente sin procesar
}
return value;
});
Finalmente, puedes analizar JSON sin perder precisión. Tomó una propuesta de 2018 llegar aquí, pero lo logramos.
Ganancias de Rendimiento que Realmente Sentirás
¿Recuerdas cuando importabas una librería completa solo para usar una función de ella? Tu navegador lo recuerda. Todavía está cargando ese paquete de 500KB.
Import defer cambia el juego:
import defer * as utils from './heavy-module.js';
// El módulo aún no se carga...
// Todavía no se carga...
utils.someFunction(); // AHORA se carga, justo cuando lo necesitas
La terminal de Bloomberg ya usa este patrón. Rob Palmer de Bloomberg dijo que reduce “cientos de milisegundos” de los tiempos de carga para aplicaciones grandes.
El módulo solo se carga cuando realmente lo tocas. Todo permanece síncrono (a diferencia de las importaciones dinámicas), así que puedes colocarlo en código existente sin reescribir todo.
Las implementaciones del navegador están en marcha, con soporte esperado en 2026. Tu tiempo de inicio está a punto de ser más rápido.
El Fin de Semana No es Domingo-Lunes en Todas Partes
Pregunta rápida: ¿Cuál es el primer día de la semana?
Si dijiste lunes, tienes razón en la mayoría de Europa. Si dijiste domingo, tienes razón en los EE.UU. Si dijiste sábado, tienes razón en partes de Oriente Medio.
Ahora: ¿Qué días son el fin de semana? ¿Sábado-Domingo? ¿Viernes-Sábado? ¿Solo viernes? ¿Solo domingo?
Si estás construyendo una aplicación de calendario, necesitas saber esto. Y la respuesta cambia según dónde esté tu usuario.
Intl.Locale extrae todo esto de los datos de configuración regional de Unicode:
const locale = new Intl.Locale('en-US');
console.log(locale.weekInfo.firstDay); // 7 (Domingo)
console.log(locale.weekInfo.weekend); // [6, 7] (Sáb, Dom)
Sin más mantener una base de datos de “qué países tienen qué fines de semana.” JavaScript lo sabe.
Las Pequeñas Victorias que Se SumanES2026 también trae un montón de mejoras menores que harán tu código más limpio:
Error.isError() Verifica si algo es realmente un error (funciona entre iframes y extensiones, a diferencia de instanceof)
Iterator.concat() Encadena iteradores juntos como en cualquier otro lenguaje, te permite hacer
Array.fromAsync() Convierte iterables asincrónicas a arrays sin escribir un bucle
Map.upsert() Actualizar-o-insertar en una sola llamada (sí, JavaScript finalmente está obteniendo esta operación básica de base de datos)
Ninguno de estos es llamativo. Todos ellos eliminan fricción.
Lo Que Esto Realmente Significa
ES2026 no solo está añadiendo características. Es JavaScript creciendo.
La API Temporal por sí sola elimina miles de líneas de código de biblioteca de las aplicaciones web. Import defer hace que los tiempos de carga sean más rápidos sin reescribir tu arquitectura. La gestión explícita de recursos previene una clase completa de errores.
¿Y lo mejor? La mayoría de estas cosas ya están disponibles en navegadores o herramientas como TypeScript. Puedes empezar a usarlas ahora.
El JavaScript que se lanzó en 1995 estaba sostenido con cinta adhesiva e buenas intenciones. Treinta años después, finalmente estamos despegando la cinta.
En cinco años, miraremos atrás a Date y los trucos de punto flotante de la manera en que miramos document.write hoy. Errores obvios con los que de alguna manera vivimos durante décadas.
Mira cómo se siente escribir JavaScript que no te pelea.
Porque honestamente, ya hemos esperado lo suficiente.

