1. ¿Cómo maneja JavaScript el modelo de concurrencia y qué papel juega el Event Loop en Node.js?
JavaScript es single-threaded, pero maneja concurrencia usando el Event Loop. Node.js delega operaciones I/O a libuv, que gestiona un pool de hilos en segundo plano. El Event Loop monitorea la pila de ejecución y la cola de callbacks, ejecutando tareas cuando la pila está libre.
2. ¿Qué diferencia hay entre el ciclo de vida de una promesa y el de async/await?
Las promesas pasan por tres estados: pending → fulfilled → rejected. Con async/await, se logra una sintaxis más legible, pero internamente siguen siendo promesas. await pausa la ejecución dentro de la función asíncrona hasta que la promesa se resuelve.
3. ¿Cómo optimizarías el rendimiento de una aplicación frontend hecha en React?
- Uso de memoization (React.memo, useMemo,
useCallback).
- Implementar lazy loading y code splitting.
- Reducir estados globales innecesarios.
- Virtualización para listas largas.
- Monitoreo con Lighthouse y React DevTools.
4. ¿Qué medidas de seguridad aplicarías en una aplicación JavaScript (frontend y backend)?
- Escapado y sanitización de entradas
(XSS).
- Content Security Policy (CSP).
- Protección contra CSRF con tokens.
- Validación de inputs con Joi o Zod.
- Autenticación segura con JWT y cookies HttpOnly.
- Auditorías de paquetes NPM.
5. ¿Qué patrones de diseño aplicas en JavaScript y cómo los usarías?
- Singleton: para instancias únicas (ej.
conexión BD).
- Observer (Pub/Sub): para eventos.
- Factory: para creación dinámica de objetos.
- Decorator: para añadir funcionalidades.
- Middleware y HOC en entornos web.
6. ¿Cómo manejarías millones de registros en una API hecha con Node.js?
- Streams para procesar en chunks.
- Paginación y cursores en BD.
- Workers o colas de mensajes.
- Cacheo con Redis.
- Monitoreo de memoria con PM2.
7. ¿Qué son los WeakMap y WeakSet en JavaScript y en qué casos los usarías?
Son colecciones con referencias débiles a objetos. No previenen la recolección de basura. Se usan para metadatos privados o para evitar fugas de memoria.
8. ¿Cómo asegurarías la escalabilidad de una aplicación Node.js en producción?
- Clustering con PM2 o cluster.
- Balanceo de carga con Nginx.
- Arquitectura de microservicios.
- Docker + Kubernetes.
- Logging centralizado y monitoreo con Prometheus/Grafana.