Funciones Modernas de JavaScript

Esta página contiene ejemplos de las características más modernas de JavaScript, como let/const, arrow functions, nuevas formas de manejar arrays y más.

Novedades en JavaScript (ES6+)

Ejemplo 1: let vs var vs const

Resultado:

Código:

function ejemploLetVarConst() { let resultado = ""; // Ejemplo con var (hoisting y function scope) resultado += "=== EJEMPLO CON var ===\n"; for (var i = 0; i < 3; i++) { resultado += `Dentro del bucle: ${i}\n`; } resultado += `Fuera del bucle: ${i}\n\n`; // Ejemplo con let (block scope) resultado += "=== EJEMPLO CON let ===\n"; for (let j = 0; j < 3; j++) { resultado += `Dentro del bucle: ${j}\n`; } // j no está definido fuera del bucle → Error si intentamos usarlo resultado += "j no está accesible fuera del bucle\n\n"; // Ejemplo con const resultado += "=== EJEMPLO CON const ===\n"; const PI = 3.1416; // PI = 3.14; // Esto produciría un error resultado += `El valor de PI es: ${PI}\n`; // Const con objetos (la referencia es constante, no el contenido) const persona = { nombre: "Juan", edad: 30 }; persona.edad = 31; // Esto es válido resultado += `Persona: ${JSON.stringify(persona)}\n`; return resultado; }

Explicación:

var tiene alcance de función y sufre de hoisting.

let tiene alcance de bloque y no sufre de hoisting de la misma manera.

const también tiene alcance de bloque pero no puede ser reasignada. Sin embargo, los objetos y arrays declarados con const pueden ser modificados.

Ejemplo 2: Arrow Functions

Resultado:

Código:

function ejemploArrowFunctions() { let resultado = ""; // Función tradicional function sumaTradicional(a, b) { return a + b; } // Arrow function equivalente const sumaFlecha = (a, b) => { return a + b; }; // Arrow function con return implícito const sumaFlechaCorta = (a, b) => a + b; resultado += `Suma tradicional: ${sumaTradicional(5, 3)}\n`; resultado += `Suma flecha: ${sumaFlecha(5, 3)}\n`; resultado += `Suma flecha corta: ${sumaFlechaCorta(5, 3)}\n\n`; // Uso con arrays const numeros = [1, 2, 3, 4, 5]; // Map con función tradicional const cuadradosTrad = numeros.map(function(x) { return x * x; }); // Map con arrow function const cuadradosFlecha = numeros.map(x => x * x); resultado += `Números: ${numeros}\n`; resultado += `Cuadrados (trad): ${cuadradosTrad}\n`; resultado += `Cuadrados (flecha): ${cuadradosFlecha}\n`; return resultado; }

Explicación:

Las arrow functions proporcionan una sintaxis más concisa para escribir funciones y no tienen su propio this, arguments, super o new.target.

Son especialmente útiles con métodos de arrays como map, filter y reduce.

Ejemplo 3: Nuevos Métodos de Arrays

Resultado:

Código:

function ejemploMetodosArrays() { const input = document.getElementById('arrayInput').value; const numeros = input.split(',').map(Number); let resultado = ""; resultado += `Array original: ${JSON.stringify(numeros)}\n\n`; // Map - transformar cada elemento const cuadrados = numeros.map(x => x * x); resultado += `Map (cuadrados): ${JSON.stringify(cuadrados)}\n`; // Filter - filtrar elementos const pares = numeros.filter(x => x % 2 === 0); resultado += `Filter (pares): ${JSON.stringify(pares)}\n`; // Reduce - reducir a un solo valor const suma = numeros.reduce((acumulador, valor) => acumulador + valor, 0); resultado += `Reduce (suma): ${suma}\n`; // Find - encontrar primer elemento que cumpla condición const mayorQue3 = numeros.find(x => x > 3); resultado += `Find (>3): ${mayorQue3}\n`; // Some - verificar si al menos uno cumple condición const hayNegativos = numeros.some(x => x < 0); resultado += `Some (<0): ${hayNegativos}\n`; // Every - verificar si todos cumplen condición const todosPositivos = numeros.every(x => x > 0); resultado += `Every (>0): ${todosPositivos}\n`; // Includes - verificar si contiene un elemento const contiene3 = numeros.includes(3); resultado += `Includes (3): ${contiene3}\n`; return resultado; }

Explicación:

JavaScript moderno introduce muchos métodos útiles para trabajar con arrays:

  • map(): Transforma cada elemento del array
  • filter(): Filtra elementos según una condición
  • reduce(): Reduce el array a un único valor
  • find(): Encuentra el primer elemento que cumple una condición
  • some(): Verifica si al menos un elemento cumple una condición
  • every(): Verifica si todos los elementos cumplen una condición
  • includes(): Verifica si el array contiene un elemento

Ejemplo 4: Destructuring y Spread Operator

Resultado:

Código:

function ejemploDestructuringSpread() { let resultado = ""; // Destructuring de arrays resultado += "=== DESTRUCTURING DE ARRAYS ===\n"; const colores = ['rojo', 'verde', 'azul']; const [primero, segundo] = colores; resultado += `Array: ${colores}\n`; resultado += `Primero: ${primero}, Segundo: ${segundo}\n\n`; // Destructuring de objetos resultado += "=== DESTRUCTURING DE OBJETOS ===\n"; const persona = { nombre: 'Ana', edad: 28, ciudad: 'Madrid' }; const { nombre, edad } = persona; resultado += `Objeto: ${JSON.stringify(persona)}\n`; resultado += `Nombre: ${nombre}, Edad: ${edad}\n\n`; // Spread operator con arrays resultado += "=== SPREAD OPERATOR (ARRAYS) ===\n"; const frutas = ['manzana', 'pera']; const masFrutas = ['naranja', 'plátano']; const todasFrutas = [...frutas, ...masFrutas, 'uva']; resultado += `Frutas: ${frutas}\n`; resultado += `Más frutas: ${masFrutas}\n`; resultado += `Todas: ${todasFrutas}\n\n`; // Spread operator con objetos resultado += "=== SPREAD OPERATOR (OBJETOS) ===\n"; const configuracion = { servidor: 'api.com', puerto: 8080 }; const usuario = { id: 1, nombre: 'Carlos' }; const configCompleta = { ...configuracion, ...usuario, tiempo: 30 }; resultado += `Configuración: ${JSON.stringify(configuracion)}\n`; resultado += `Usuario: ${JSON.stringify(usuario)}\n`; resultado += `Completa: ${JSON.stringify(configCompleta)}\n`; return resultado; }

Explicación:

Destructuring permite extraer valores de arrays o propiedades de objetos en variables distintas.

Spread operator (...) permite expandir elementos de un array o propiedades de un objeto.

Ejemplo 5: Parámetros por Defecto y Template Literals

Resultado:

Código:

function ejemploParametrosTemplate() { let resultado = ""; // Parámetros por defecto resultado += "=== PARÁMETROS POR DEFECTO ===\n"; const saludar = (nombre = 'Visitante', saludo = 'Hola') => { return `${saludo}, ${nombre}!`; }; resultado += saludar() + '\n'; resultado += saludar('Juan') + '\n'; resultado += saludar('María', 'Buenos días') + '\n\n'; // Template literals resultado += "=== TEMPLATE LITERALS ===\n"; const producto = 'Tablet'; const precio = 299; const cantidad = 2; // Con concatenación tradicional const mensajeTradicional = 'El ' + producto + ' cuesta ' + precio + ' euros. ' + cantidad + ' unidades ' + 'cuestan ' + (precio * cantidad) + ' euros.'; // Con template literals const mensajeTemplate = `El ${producto} cuesta ${precio} euros. ${cantidad} unidades cuestan ${precio * cantidad} euros.`; resultado += "Tradicional: " + mensajeTradicional + "\n"; resultado += "Template: " + mensajeTemplate + "\n\n"; // Plantillas multilínea resultado += "=== MULTILÍNEA ===\n"; const receta = ` Receta: Tarta de Manzana Ingredientes: - 4 manzanas - 200g de harina - 100g de azúcar - 2 huevos Instrucciones: 1. Pelar y cortar las manzanas 2. Mezclar los ingredientes 3. Hornear a 180°C por 30 minutos `; resultado += receta; return resultado; }

Explicación:

Parámetros por defecto permiten asignar valores predeterminados a los parámetros de una función.

Template literals (entre backticks ``) permiten interpolación de variables y cadenas multilínea.

Ejemplo 6: Async/Await

Resultado:

Código:

// Función que simula una operación asíncrona const obtenerDatos = (id, demora = 1000) => { return new Promise((resolve) => { setTimeout(() => { resolve({ id, nombre: `Usuario ${id}`, fecha: new Date().toLocaleTimeString() }); }, demora); }); }; async function ejemploAsyncAwait() { let resultado = ""; resultado += "Iniciando operaciones asíncronas...\n\n"; try { // Con then/catch (método tradicional) resultado += "=== CON THEN/CATCH ===\n"; await obtenerDatos(1, 800) .then(datos => { resultado += `Datos recibidos: ${JSON.stringify(datos)}\n`; return obtenerDatos(2, 600); }) .then(masDatos => { resultado += `Más datos: ${JSON.stringify(masDatos)}\n`; }) .catch(error => { resultado += `Error: ${error}\n`; }); resultado += "\n"; // Con async/await (método moderno) resultado += "=== CON ASYNC/AWAIT ===\n"; const datos1 = await obtenerDatos(3, 700); resultado += `Datos 1: ${JSON.stringify(datos1)}\n`; const datos2 = await obtenerDatos(4, 500); resultado += `Datos 2: ${JSON.stringify(datos2)}\n`; // Ejecución en paralelo con Promise.all resultado += "\n=== PARALELO CON PROMISE.ALL ===\n"; const [datos5, datos6, datos7] = await Promise.all([ obtenerDatos(5, 1200), obtenerDatos(6, 900), obtenerDatos(7, 1100) ]); resultado += `Datos 5: ${JSON.stringify(datos5)}\n`; resultado += `Datos 6: ${JSON.stringify(datos6)}\n`; resultado += `Datos 7: ${JSON.stringify(datos7)}\n`; } catch (error) { resultado += `Error: ${error}\n`; } resultado += "\nTodas las operaciones completadas!"; return resultado; }

Explicación:

Async/await es una forma moderna de trabajar con operaciones asíncronas, haciendo que el código parezca síncrono.

Una función async siempre devuelve una promesa, y await pausa la ejecución hasta que la promesa se resuelve.

Promise.all() permite ejecutar múltiples promesas en paralelo.

Bajar el archivo de texto con el código completo

Volver al Índice