JavaScript
Guía completa sobre las características modernas de JavaScript ES6+ con ejemplos prácticos
Introducción
Sección titulada «Introducción»JavaScript ha evolucionado significativamente desde ES6 (2015). Este manual cubre las características más importantes del JavaScript moderno que todo desarrollador debe conocer.
- Variables y Constantes
- Funciones Arrow
- Destructuring
- Template Literals
- Módulos
- Promesas y Async/Await
Variables y Constantes
Sección titulada «Variables y Constantes»let y const
Sección titulada «let y const»En JavaScript moderno, se recomienda usar let
y const
en lugar de var
:
// ❌ Evitarvar nombre = "Juan";
// ✅ Recomendadoconst nombre = "Juan"; // Para valores que no cambiaránlet edad = 25; // Para valores que pueden cambiar
Diferencias clave
Sección titulada «Diferencias clave»Palabra clave | Reasignación | Hoisting | Scope |
---|---|---|---|
var | ✅ | ✅ | Función |
let | ✅ | ❌ | Bloque |
const | ❌ | ❌ | Bloque |
Funciones Arrow
Sección titulada «Funciones Arrow»Las funciones arrow proporcionan una sintaxis más concisa:
// Función tradicionalfunction sumar(a, b) { return a + b;}
// Función arrowconst sumar = (a, b) => a + b;
// Con un solo parámetroconst duplicar = x => x * 2;
// Sin parámetrosconst saludar = () => "¡Hola!";
Nota importante: Las funciones arrow no tienen su propio contexto
this
, heredan elthis
del ámbito padre.
Destructuring
Sección titulada «Destructuring»Permite extraer valores de arrays y objetos de forma elegante:
Destructuring de Arrays
Sección titulada «Destructuring de Arrays»const numeros = [1, 2, 3, 4, 5];
// Método tradicionalconst primero = numeros[0];const segundo = numeros[1];
// Con destructuringconst [primero, segundo, ...resto] = numeros;console.log(primero); // 1console.log(segundo); // 2console.log(resto); // [3, 4, 5]
Destructuring de Objetos
Sección titulada «Destructuring de Objetos»const persona = { nombre: "Ana", edad: 30, ciudad: "Madrid"};
// Con destructuringconst { nombre, edad, profesion = "No especificada" } = persona;console.log(nombre); // "Ana"console.log(profesion); // "No especificada" (valor por defecto)
Template Literals
Sección titulada «Template Literals»Facilitan la interpolación de strings y strings multilínea:
const nombre = "Carlos";const edad = 28;
// Método tradicionalconst mensaje = "Hola, soy " + nombre + " y tengo " + edad + " años";
// Con template literalsconst mensaje = `Hola, soy ${nombre} y tengo ${edad} años`;
// Strings multilíneaconst html = ` <div> <h1>${nombre}</h1> <p>Edad: ${edad}</p> </div>`;
Módulos
Sección titulada «Módulos»Los módulos ES6 permiten organizar el código en archivos separados:
Exportar
Sección titulada «Exportar»export const PI = 3.14159;
export function area(radio) { return PI * radio * radio;}
export default function perimetro(radio) { return 2 * PI * radio;}
Importar
Sección titulada «Importar»import perimetro, { PI, area } from './math.js';
console.log(PI); // 3.14159console.log(area(5)); // 78.53975console.log(perimetro(5)); // 31.4159
Promesas y Async/Await
Sección titulada «Promesas y Async/Await»Promesas
Sección titulada «Promesas»Las promesas manejan operaciones asíncronas de forma más elegante:
// Crear una promesafunction obtenerDatos() { return new Promise((resolve, reject) => { setTimeout(() => { const exito = Math.random() > 0.5; if (exito) { resolve("Datos obtenidos correctamente"); } else { reject("Error al obtener datos"); } }, 1000); });}
// Usar la promesaobtenerDatos() .then(datos => console.log(datos)) .catch(error => console.error(error));
Async/Await
Sección titulada «Async/Await»Sintaxis más limpia para trabajar con promesas:
async function procesarDatos() { try { const datos = await obtenerDatos(); console.log(datos);
// Procesar datos aquí const resultado = await procesarResultado(datos); return resultado; } catch (error) { console.error("Error:", error); }}
Ejemplos Prácticos
Sección titulada «Ejemplos Prácticos»Fetch API con Async/Await
Sección titulada «Fetch API con Async/Await»async function obtenerUsuarios() { try { const response = await fetch('https://api.ejemplo.com/usuarios');
if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); }
const usuarios = await response.json(); return usuarios; } catch (error) { console.error('Error al obtener usuarios:', error); throw error; }}
// UsoobtenerUsuarios() .then(usuarios => { usuarios.forEach(({ nombre, email }) => { console.log(`${nombre}: ${email}`); }); }) .catch(error => console.error('Error:', error));
Manejo de Arrays con Métodos Modernos
Sección titulada «Manejo de Arrays con Métodos Modernos»const productos = [ { nombre: "Laptop", precio: 1200, categoria: "electrónicos" }, { nombre: "Camisa", precio: 30, categoria: "ropa" }, { nombre: "Teléfono", precio: 800, categoria: "electrónicos" }, { nombre: "Zapatos", precio: 120, categoria: "ropa" }];
// Filtrar productos electrónicosconst electronicos = productos.filter(({ categoria }) => categoria === "electrónicos");
// Obtener solo los nombresconst nombres = productos.map(({ nombre }) => nombre);
// Calcular precio totalconst total = productos.reduce((sum, { precio }) => sum + precio, 0);
// Encontrar producto más caroconst masCaro = productos.reduce((max, producto) => producto.precio > max.precio ? producto : max);
console.log({ electronicos, nombres, total, masCaro });
Mejores Prácticas
Sección titulada «Mejores Prácticas»1. Usa const por defecto
Sección titulada «1. Usa const por defecto»// ✅ Buena prácticaconst configuracion = { api: "https://api.ejemplo.com" };const usuarios = [];
// ❌ Evitarvar configuracion = { api: "https://api.ejemplo.com" };
2. Destructuring en parámetros de función
Sección titulada «2. Destructuring en parámetros de función»// ✅ Claro y concisofunction crearUsuario({ nombre, email, edad = 18 }) { return { nombre, email, edad, id: Date.now() };}
// Usoconst usuario = crearUsuario({ nombre: "Ana", email: "ana@ejemplo.com" });
3. Usa template literals para strings complejos
Sección titulada «3. Usa template literals para strings complejos»// ✅ Legibleconst mensaje = ` Estimado/a ${nombre},
Su pedido #${numeroPedido} ha sido procesado. Total: ${formatearPrecio(total)}
Saludos cordiales`;
Recursos Adicionales
Sección titulada «Recursos Adicionales»Conclusión
Sección titulada «Conclusión»El JavaScript moderno ofrece herramientas poderosas que hacen el código más legible, mantenible y eficiente. Dominar estas características es esencial para cualquier desarrollador web actual.
Próximos pasos: Practica estos conceptos creando pequeños proyectos y consulta la documentación oficial cuando tengas dudas.