CodeForge

JavaScript de Cero a Experto / APIs del navegador

localStorage: datos que sobreviven a la recarga

Teoría20 min20 XP

Desde el módulo 8 arrastras una espina: recargas la página y "Mi Bolsillo" vuelve a nacer vacío. Hoy se acaba: localStorage le da a tu sitio un cajón persistente en el navegador — sin servidor, sin cuenta, sin base de datos. Es la primera API del navegador de este módulo y la que más vas a usar.

El cajón del local

Haz la prueba completa: recarga el preview varias veces (el botón de refresh del playground) y mira el contador crecer — ese número NO vive en tu código ni en variables: vive en el disco, cortesía del navegador. La API es un diccionario simplísimo: setItem(llave, valor), getItem(llave) (con null si no existe — de ahí el chequeo), y removeItem(llave). Existe también localStorage.clear(): vacía TODO el cajón del sitio — respétalo como a un arma.

Solo texto + JSON = objetos persistentes

El cajón guarda strings. ¿Y los gastos de "Mi Bolsillo" — array de objetos? Tu empacadora al vacío del módulo 5 cierra el círculo:

Agrega tres gastos, recarga el preview… y ahí siguen. El patrón de la pareja cargar/guardarJSON.parse al leer, JSON.stringify al escribir, con el caso null cubierto — es EL rito de localStorage; escríbelo una vez por proyecto y olvídate. Recuerda del módulo 5 qué sobrevive al empaque: datos sí; funciones, fechas como objetos y clases, no (guarda datos crudos y reconstruye).

Tres notas honestas para cerrar: existe el hermano sessionStorage — misma API exacta, pero su cajón se vacía al cerrar la pestaña (útil para "borradores" de una sesión). El cajón es SÍNCRONO y pequeño (~5MB): para datos serios de verdad existe IndexedDB (grande y asíncrona — la conocerás cuando la necesites). Y la regla de seguridad: NUNCA guardes secretos (tokens, contraseñas) en localStorage — cualquier script que corra en tu página puede leerlo; eso te lo resolverán las cookies httpOnly en los supercursos de backend.

Guardas tus gastos con localStorage.setItem('gastos', gastos) — el array directo, sin stringify. Al leerlos con getItem y hacer .length te da 15 aunque solo hay 2 gastos. ¿Qué pasó?

Mini-reto

Persistencia con criterio: 1) agrega al playground de gastos un botón "Vaciar" que haga removeItem y repinte; 2) guarda también la fecha del último cambio (new Date().toISOString() — texto, cajón feliz) y píntala; 3) rompe a propósito: guarda un objeto SIN stringify, míralo con getItem, y luego abre las DevTools del navegador → pestaña Application → Local Storage, y observa tu cajón real con todas sus llaves. Conocer esa pestaña te salvará horas.

Qué sigue

Ya persistes datos. La próxima API es de otra familia — los OBSERVERS del navegador — y resuelve algo que en SC-01 hiciste con GSAP: enterarte de cuándo un elemento ENTRA en pantalla, sin espiar el scroll a cada milisegundo. IntersectionObserver: el portero que avisa.