Guías
Frontend Actualizado el 6 de noviembre de 2026

JavaScript

JavaScript moderno (ES2015–ES2025): sintaxis, arrays, objetos, módulos, asincronía con fetch, DOM, Map/Set, fechas y manejo de errores.

  • #javascript
  • #es2025
  • #async
  • #dom
  • #frontend

Variables y tipos

CódigoSignificado
const / letConstante (la referencia no cambia) / variable reasignable, ambas con ámbito de bloque
string, number, bigint, booleanPrimitivos de texto, número de 64 bits, entero arbitrario (10n), lógico
undefined / nullSin asignar / ausencia intencional de valor
symbolIdentificador único (Symbol('id'))
typeof xTipo en texto; ojo: typeof null === 'object'
Array.isArray(x)Forma correcta de comprobar si es un array
=== / !==Comparación estricta; evita ==
Number.isNaN(x)Comprueba NaN sin conversiones implícitas

Destructuring, spread y rest

javascript
const { name, role = 'user', ...rest } = user;   // default + rest
const { address: { city } = {} } = user;         // nested with fallback
const [first, , third] = items;                  // skip elements
[a, b] = [b, a];                                 // swap values

const merged = { ...defaults, ...options };      // shallow merge (last wins)
const all = [...listA, ...listB];
const sum = (...nums) => nums.reduce((acc, n) => acc + n, 0);

Funciones

javascript
function greet(name = 'mundo') {
  return `Hola, ${name}`;
}

const double = (n) => n * 2;                 // implicit return
const toUser = (name) => ({ name });         // return an object: wrap in ()

const counter = () => {
  let count = 0;
  return () => ++count;                      // closure keeps state
};

Las arrow functions no tienen this propio: lo toman del contexto. Úsalas en callbacks, no como métodos de objeto.

Strings

CódigoSignificado
`Total: ${price * qty}`Template literal con interpolación y saltos de línea
s.includes('x')Contiene el texto
s.startsWith('a') / s.endsWith('z')Empieza / termina con
s.trim()Quita espacios al inicio y al final
s.padStart(5, '0')Rellena a la izquierda: '42' pasa a '00042'
s.replaceAll('-', ' ')Reemplaza todas las coincidencias
s.split(',')Divide en un array
s.at(-1)Último carácter
s.localeCompare(t, 'es')Compara respetando acentos y el idioma

Arrays

MétodoQué hace
map(fn)Nuevo array transformando cada elemento
filter(fn)Nuevo array con los que cumplen la condición
reduce(fn, init)Acumula en un solo valor (suma, objeto, etc.)
find(fn) / findLast(fn)Primer / último elemento que cumple (o undefined)
some(fn) / every(fn)Alguno / todos cumplen la condición
includes(x)Contiene el valor (funciona con NaN)
flat() / flatMap(fn)Aplana un nivel / transforma y aplana
at(-1)Acceso con índice negativo (último elemento)
toSorted(fn) / toReversed() / with(i, v)Copias ordenada / invertida / con un elemento cambiado, sin mutar
structuredClone(obj)Copia profunda (global, no método de array)
javascript
const total = cart.reduce((acc, item) => acc + item.price * item.qty, 0);
const byPrice = products.toSorted((a, b) => a.price - b.price);

Objetos

CódigoSignificado
Object.keys(o) / Object.values(o)Array de claves / valores
Object.entries(o)Array de pares [clave, valor]
Object.fromEntries(pairs)Construye un objeto desde pares (inverso de entries)
Object.groupBy(list, fn)Agrupa en un objeto según la clave que devuelva fn
user?.address?.cityOptional chaining: undefined si algo intermedio es nulo
fn?.()Llama solo si la función existe
value ?? 'default'Usa el default solo si es null o undefined (no con 0 ni '')
opts.retries ??= 3Asigna solo si es null o undefined
Object.hasOwn(o, 'key')La propiedad es propia (no heredada)
javascript
const byStatus = Object.groupBy(orders, (o) => o.status);
const prices = Object.fromEntries(Object.entries(raw).map(([k, v]) => [k, Number(v)]));

Clases y módulos ESM

javascript
// user.js
export class User {
  #password;                                 // private field
  static count = 0;

  constructor(name, password) {
    this.name = name;
    this.#password = password;
    User.count++;
  }

  get initials() {
    return this.name.slice(0, 2).toUpperCase();
  }
}
export default function createUser(name) { return new User(name, ''); }

// main.js
import createUser, { User } from './user.js';
const { Chart } = await import('./chart.js');   // dynamic import (lazy load)

Asincronía: promesas y async/await

CódigoSignificado
await promiseEspera el resultado dentro de una función async (o en el nivel superior de un módulo)
Promise.all([...])Espera todas; falla en cuanto una falla
Promise.allSettled([...])Espera todas y devuelve { status, value | reason } de cada una
Promise.any([...])La primera que se cumple; falla solo si fallan todas
Promise.race([...])La primera que termine, se cumpla o falle
AbortSignal.timeout(5000)Señal que cancela una petición tras 5 segundos
javascript
const [user, posts] = await Promise.all([getUser(id), getPosts(id)]);

Fetch con manejo de errores

javascript
async function getJson(url, { timeoutMs = 5000, signal } = {}) {
  const res = await fetch(url, {
    headers: { Accept: 'application/json' },
    signal: signal ?? AbortSignal.timeout(timeoutMs),
  });
  if (!res.ok) {
    // fetch only rejects on network errors, not on 4xx/5xx
    throw new Error(`HTTP ${res.status} ${res.statusText}`);
  }
  return res.json();
}

const controller = new AbortController();
try {
  const data = await getJson('/api/users', { signal: controller.signal });
  console.log(data);
} catch (err) {
  if (err.name === 'AbortError') console.warn('Request cancelled');
  else console.error(err);
}
// controller.abort(); cancels the request

DOM y eventos

javascript
const form = document.querySelector('#signup');
const items = document.querySelectorAll('.item');      // static NodeList

form.addEventListener('submit', (event) => {
  event.preventDefault();
  const data = Object.fromEntries(new FormData(form));
  console.log(data);
});

// Event delegation: one listener for many (even future) children
document.querySelector('#list').addEventListener('click', (event) => {
  const button = event.target.closest('button[data-id]');
  if (button) removeItem(button.dataset.id);
});

el.classList.toggle('active');
el.textContent = userInput;                // safe: never use innerHTML with user data

Map y Set

CódigoSignificado
new Map([[k, v]])Diccionario con claves de cualquier tipo y orden de inserción
map.set(k, v) / map.get(k) / map.has(k)Escribir / leer / comprobar una clave
map.sizeNúmero de entradas
Map.groupBy(list, fn)Agrupa en un Map (admite claves no string)
new Set(array)Colección de valores únicos
[...new Set(array)]Quitar duplicados de un array
a.union(b) / a.intersection(b) / a.difference(b)Operaciones de conjuntos (ES2025)
new WeakMap()Claves objeto sin impedir su recolección de memoria

Fechas

javascript
// Store and send dates in UTC (ISO 8601)
const createdAt = new Date().toISOString();       // "2026-11-06T15:32:00.000Z"

// Convert to local time only when displaying
const fmt = new Intl.DateTimeFormat('es-MX', {
  timeZone: 'America/Mexico_City',
  dateStyle: 'medium',
  timeStyle: 'short',
});
fmt.format(new Date(createdAt));

new Intl.NumberFormat('es-MX', { style: 'currency', currency: 'MXN' }).format(1234.5);

Usa siempre nombres de zona (America/Mexico_City), nunca offsets fijos como -06:00.

Manejo de errores

javascript
class ValidationError extends Error {
  constructor(message, options) {
    super(message, options);
    this.name = 'ValidationError';
  }
}

try {
  JSON.parse(raw);
} catch (err) {
  throw new ValidationError('Invalid payload', { cause: err });  // keep the original error
} finally {
  cleanup();
}
  • Lanza siempre objetos Error (no strings): conservan el stack trace.
  • En promesas sin await, añade .catch(): los rechazos no capturados se pierden o tumban el proceso en Node.js.