ESC cerrar

Herramientas para Estudiantes

5 secciones

Herramientas AI para Estudiantes

Recursos gratuitos que potencian tu aprendizaje en 2025

GitHub Education 100% Gratis para Estudiantes

Notepad++

LIGERO

Editor de código ligero y potente para Windows. Ideal para edición rápida de archivos.

Ultra ligero Syntax highlight Plugins Multi-documento
Descargar

Flameshot

SCREENSHOTS

Herramienta de capturas de pantalla con anotaciones. Ideal para documentar código y bugs.

Capturas editables Anotaciones Blur & flechas Multiplataforma
Descargar

PowerShell 7+

TERMINAL

Shell moderno y multiplataforma de Microsoft. Automatiza tareas y scripts avanzados.

Multiplataforma Scripts avanzados Azure integrado Cmdlets potentes
Instalar

VS Code for the Web

NAVEGADOR

Visual Studio Code directamente en tu navegador. Sin instalación, desde cualquier lugar.

Sin instalación GitHub integrado Extensiones Sincronización
Abrir Editor

Google Colab

NOTEBOOKS

Jupyter Notebooks en la nube gratis. GPU incluida para Machine Learning y Data Science.

GPU gratis Python & ML Colaboración Google Drive
Abrir Colab

AntiGravity AI

PRODUCTIVIDAD

Asistente IA para productividad y automatización de tareas. Potencia tu flujo de trabajo.

Automatización Notas inteligentes Integración apps Flujos de trabajo
Explorar

DeepL Translate

TRADUCCIÓN

El mejor traductor con IA. Ideal para documentación técnica y papers académicos.

Traducción precisa Contexto técnico Múltiples idiomas Docs & PDFs
Traducir Ahora

DeepSeek

OPEN SOURCE

Modelo de IA chino de código abierto. Excelente para código y razonamiento matemático.

Código avanzado Matemáticas Open Source API gratuita
Probar DeepSeek

Claude

AI ASSISTANT

Asistente de IA de Anthropic para resolver dudas, explicar código y aprender conceptos.

Explicación de código Debugging asistido Generación de tests Contexto largo
Probar Claude

Le Chat (Mistral AI)

ECONÓMICO

Asistente IA francés, potente y accesible. Ideal para estudiantes con presupuesto limitado.

Código & debugging Muy económico Multilingüe API asequible
Probar Le Chat

GitHub Copilot Pro

GRATIS

Tu programador par con IA. Sugerencias de código en tiempo real directamente en tu editor.

Autocompletado inteligente Contexto del proyecto Múltiples lenguajes
Activar Copilot

GitHub Student Pack

100+ TOOLS

Pack exclusivo con herramientas profesionales gratuitas para estudiantes verificados.

JetBrains IDEs DigitalOcean $200 Canva Pro Namecheap dominio
Obtener Pack
Mejores Prácticas con IA en Educación
Siempre revisa y entiende el código generado
Usa IA como complemento, no como reemplazo del aprendizaje
Valida sugerencias con tests unitarios
No compartas código sensible o credenciales

Activa tu cuenta de estudiante GitHub

Verifica tu correo institucional y accede a todos los beneficios

Verificar Ahora

Videos Educativos

Tutoriales, conferencias y cursos seleccionados para tu aprendizaje

Fundamentos de Hardware

7 videos
How do SSDs Work?
14:43

How do SSDs Work?

Branch Education
How does Computer Memory Work?
21:46

How does Computer Memory Work?

Branch Education
How do Graphics Cards Work?
25:29

How do Graphics Cards Work?

Branch Education
How does Bluetooth Work?
15:43

How does Bluetooth Work?

Branch Education
How does a Smartphone Camera Work?
12:18

How does a Smartphone Camera Work?

Branch Education
How does a CPU Work?
19:34

How does a CPU Work?

Branch Education
How do Touchscreens Work?
12:45

How do Touchscreens Work?

Branch Education

Tutoriales de Programación

4 videos
Python Full Course for Beginners
6:14:07

Python Full Course for Beginners

Programming with Mosh
Java Tutorial for Beginners
2:30:48

Java Tutorial for Beginners

Programming with Mosh
SQL Tutorial - Full Database Course
4:20:37

SQL Tutorial - Full Database Course

freeCodeCamp
JavaScript Full Course
3:26:42

JavaScript Full Course

freeCodeCamp

Arquitectura & DevOps

4 videos
Docker Tutorial for Beginners
2:46:14

Docker Tutorial for Beginners

TechWorld with Nana
Kubernetes Tutorial for Beginners
3:36:52

Kubernetes Tutorial for Beginners

TechWorld with Nana
AWS Tutorial For Beginners
4:15:30

AWS Tutorial For Beginners

Simplilearn
Microservices Architecture
12:35

Microservices Architecture

ByteByteGo

Data Engineering

4 videos
Data Engineering Full Course
5:18:22

Data Engineering Full Course

freeCodeCamp
Apache Spark Tutorial
3:45:10

Apache Spark Tutorial

Simplilearn
Apache Airflow Tutorial
1:30:45

Apache Airflow Tutorial

coder2j
Data Warehouse Concepts
15:42

Data Warehouse Concepts

ByteByteGo

Desarrollo Web Frontend

6 videos
React Tutorial for Beginners
1:20:47

React Tutorial for Beginners

Programming with Mosh
HTML & CSS Full Course
6:31:33

HTML & CSS Full Course

SuperSimpleDev
CSS in 100 Seconds
2:22

CSS in 100 Seconds

Fireship
Node.js and Express.js Full Course
8:16:47

Node.js and Express.js Full Course

freeCodeCamp
CSS Flexbox in 100 Seconds
2:06

CSS Flexbox in 100 Seconds

Fireship
React 18 Full Course
5:38:45

React 18 Full Course

freeCodeCamp

Computer Science Fundamentals

6 videos
Algorithms and Data Structures
5:22:09

Algorithms and Data Structures

freeCodeCamp
Big O Notation - Full Course
1:56:20

Big O Notation - Full Course

freeCodeCamp
Git and GitHub Crash Course
1:08:29

Git and GitHub Crash Course

freeCodeCamp
Introduction to Algorithms
1:51:38

Introduction to Algorithms

CS50
Data Structures Easy to Advanced
8:03:05

Data Structures Easy to Advanced

freeCodeCamp
Dynamic Programming - Full Course
5:01:39

Dynamic Programming - Full Course

freeCodeCamp

Notion Workspace

Documentación, notas y recursos del curso en tiempo real

Workspace en Construcción

Próximamente: documentación del curso, notas colaborativas, recursos y más

Apuntes de Clase
Ejercicios Prácticos
Code Snippets
Recursos Externos
Calendario Académico
Notas Colaborativas
Para configurar: agrega tu URL de Notion pública en el componente
Tips para usar Notion como estudiante

Cuenta Educativa

Notion Plus gratis con tu email .edu o institucional

Templates

Usa templates para notas de clase, proyectos y tracking

Bases de Datos

Organiza tareas, materias y calificaciones con databases

Colaboración

Comparte páginas con compañeros para proyectos grupales

Code Snippets - Biblioteca de Código
File Edit Search View

Conexión a PostgreSQL

Conectar a base de datos PostgreSQL con psycopg2

conexión_a_postgresql. python
21 líneas
123456789101112131415161718192021
                        import psycopg2
from psycopg2 import sql

# Conexión a la base de datos
conn = psycopg2.connect(
    host="localhost",
    database="mi_base_datos",
    user="usuario",
    password="password"
)

# Crear cursor
cursor = conn.cursor()

# Ejecutar query
cursor.execute("SELECT * FROM usuarios WHERE activo = %s", (True,))
resultados = cursor.fetchall()

# Cerrar conexión
cursor.close()
conn.close()
                      
databasepostgresqlpsycopg2

API REST con FastAPI

Endpoint básico con FastAPI

api_rest_con_fastapi. python
19 líneas
12345678910111213141516171819
                        from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

class Usuario(BaseModel):
    nombre: str
    email: str
    edad: int | None = None

@app.get("/usuarios/{usuario_id}")
async def obtener_usuario(usuario_id: int):
    # Lógica para buscar usuario
    return {"id": usuario_id, "nombre": "Juan"}

@app.post("/usuarios/")
async def crear_usuario(usuario: Usuario):
    # Lógica para crear usuario
    return {"mensaje": "Usuario creado", "data": usuario}
                      
apifastapirest

Análisis de Datos con Pandas

Operaciones comunes de DataFrame

análisis_de_datos_con_pandas. python
28 líneas
12345678910111213141516171819202122232425262728
                        import pandas as pd
import numpy as np

# Leer CSV
df = pd.read_csv('ventas.csv')

# Explorar datos
print(df.head())        # Primeras 5 filas
print(df.info())        # Tipos de datos y nulos
print(df.describe())    # Estadísticas básicas

# Filtrar datos
ventas_altas = df[df['monto'] > 1000]
ventas_2024 = df[df['fecha'].str.startswith('2024')]

# Agrupar y agregar
por_region = df.groupby('region').agg({
    'monto': ['sum', 'mean', 'count'],
    'cliente': 'nunique'
}).round(2)

# Crear columnas calculadas
df['margen'] = df['venta'] - df['costo']
df['rentabilidad'] = (df['margen'] / df['venta'] * 100).round(2)

# Exportar
df.to_csv('reporte.csv', index=False)
df.to_excel('reporte.xlsx', sheet_name='Ventas')
                      
pandasdataframeanalyticsdata

List Comprehensions y Generators

Patrones Pythónicos para transformar datos

list_comprehensions_y_generators. python
24 líneas
123456789101112131415161718192021222324
                        # List Comprehension - crear lista filtrada
numeros = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pares = [n for n in numeros if n % 2 == 0]  # [2, 4, 6, 8, 10]

# Transformación con comprehension
cuadrados = [n**2 for n in range(1, 6)]  # [1, 4, 9, 16, 25]

# Dictionary Comprehension
usuarios = ['ana', 'luis', 'carlos']
usuarios_dict = {u: len(u) for u in usuarios}
# {'ana': 3, 'luis': 4, 'carlos': 6}

# Generator Expression (memoria eficiente)
suma_millones = sum(x**2 for x in range(1_000_000))

# Generator Function con yield
def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

for num in fibonacci(10):
    print(num)  # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
                      
comprehensiongeneratorpythonicfunctional

Encapsulamiento - Clase con atributos privados

POO Pilar 1: Proteger datos internos con getters/setters y validación

encapsulamiento_-_clase_con_atributos_privados. java
48 líneas
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
                        /**
 * Encapsulamiento: Ocultar implementación interna
 * Atributos privados + métodos públicos de acceso
 */
public class Empleado {
    // Atributos privados - no accesibles directamente
    private String rut;
    private String nombre;
    private double salario;
    private boolean activo;

    // Constructor con validación
    public Empleado(String rut, String nombre, double salario) {
        this.setRut(rut);      // Usa setter para validar
        this.nombre = nombre;
        this.setSalario(salario);
        this.activo = true;
    }

    // Getter - acceso controlado de lectura
    public String getRut() {
        return this.rut;
    }

    // Setter con validación - control de escritura
    public void setRut(String rut) {
        if (rut == null || rut.length() < 8) {
            throw new IllegalArgumentException("RUT inválido");
        }
        this.rut = rut;
    }

    public double getSalario() {
        return this.salario;
    }

    public void setSalario(double salario) {
        if (salario < 0) {
            throw new IllegalArgumentException("Salario no puede ser negativo");
        }
        this.salario = salario;
    }

    // Método de negocio encapsulado
    public double calcularSalarioAnual() {
        return this.salario * 12 + (this.salario * 0.5); // + aguinaldo
    }
}
                      
pooencapsulamientogetters-settersvalidacion

Herencia - Extensión de clases

POO Pilar 2: Reutilizar código con extends y super()

herencia_-_extensión_de_clases. java
50 líneas
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
                        /**
 * Herencia: Crear jerarquías de clases
 * Clase hija hereda atributos y métodos de la padre
 */

// Clase padre (superclase)
public class Persona {
    protected String nombre;
    protected String email;
    protected LocalDate fechaNacimiento;

    public Persona(String nombre, String email) {
        this.nombre = nombre;
        this.email = email;
    }

    public String presentarse() {
        return "Hola, soy " + this.nombre;
    }

    public int calcularEdad() {
        return Period.between(fechaNacimiento, LocalDate.now()).getYears();
    }
}

// Clase hija (subclase) - hereda de Persona
public class Estudiante extends Persona {
    private String matricula;
    private String carrera;
    private List<String> asignaturas;

    // Constructor llama a super() para inicializar padre
    public Estudiante(String nombre, String email, String matricula, String carrera) {
        super(nombre, email);  // Llama constructor padre
        this.matricula = matricula;
        this.carrera = carrera;
        this.asignaturas = new ArrayList<>();
    }

    // Método propio de Estudiante
    public void inscribirAsignatura(String asignatura) {
        this.asignaturas.add(asignatura);
    }

    // Sobrescribir método padre
    @Override
    public String presentarse() {
        return super.presentarse() + " y estudio " + this.carrera;
    }
}
                      
pooherenciaextendssuper

Polimorfismo - Múltiples formas

POO Pilar 3: Un mismo método con diferentes comportamientos

polimorfismo_-_múltiples_formas. java
68 líneas
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
                        /**
 * Polimorfismo: "Muchas formas"
 * - Sobrecarga: mismo nombre, diferentes parámetros
 * - Sobrescritura: @Override en clases hijas
 */

// Clase abstracta base
public abstract class Vehiculo {
    protected String marca;
    protected String modelo;

    public Vehiculo(String marca, String modelo) {
        this.marca = marca;
        this.modelo = modelo;
    }

    // Método abstracto - cada vehículo lo implementa diferente
    public abstract void acelerar();

    // Método concreto heredable
    public String getInfo() {
        return marca + " " + modelo;
    }
}

// Polimorfismo por sobrescritura
public class Auto extends Vehiculo {
    private int numeroPuertas;

    public Auto(String marca, String modelo, int puertas) {
        super(marca, modelo);
        this.numeroPuertas = puertas;
    }

    @Override
    public void acelerar() {
        System.out.println("El auto acelera con el pedal");
    }
}

public class Moto extends Vehiculo {
    private int cilindrada;

    public Moto(String marca, String modelo, int cc) {
        super(marca, modelo);
        this.cilindrada = cc;
    }

    @Override
    public void acelerar() {
        System.out.println("La moto acelera con el puño");
    }
}

// Uso del polimorfismo
public class Main {
    public static void main(String[] args) {
        // Una variable del tipo padre puede referenciar hijos
        List<Vehiculo> vehiculos = new ArrayList<>();
        vehiculos.add(new Auto("Toyota", "Corolla", 4));
        vehiculos.add(new Moto("Honda", "CBR", 600));

        // Cada uno ejecuta SU versión de acelerar()
        for (Vehiculo v : vehiculos) {
            v.acelerar();  // Polimorfismo en acción
        }
    }
}
                      
poopolimorfismooverrideabstract

Abstracción - Interfaces

POO Pilar 4: Definir contratos con interface e implements

abstracción_-_interfaces. java
68 líneas
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
                        /**
 * Abstracción: Ocultar complejidad, mostrar solo lo esencial
 * Interface = contrato que las clases deben cumplir
 */

// Interface define QUÉ hacer, no CÓMO
public interface Registrable {
    String obtenerIdentificador();
    LocalDateTime getFechaRegistro();
    boolean validar();
}

// Interface para persistencia
public interface Persistible {
    void guardar();
    void eliminar();
    void actualizar();
}

// Clase implementa múltiples interfaces
public class Producto implements Registrable, Persistible {
    private String codigo;
    private String nombre;
    private double precio;
    private LocalDateTime fechaCreacion;

    public Producto(String codigo, String nombre, double precio) {
        this.codigo = codigo;
        this.nombre = nombre;
        this.precio = precio;
        this.fechaCreacion = LocalDateTime.now();
    }

    // Implementación de Registrable
    @Override
    public String obtenerIdentificador() {
        return this.codigo;
    }

    @Override
    public LocalDateTime getFechaRegistro() {
        return this.fechaCreacion;
    }

    @Override
    public boolean validar() {
        return codigo != null && !codigo.isEmpty() && precio > 0;
    }

    // Implementación de Persistible
    @Override
    public void guardar() {
        if (this.validar()) {
            System.out.println("Guardando producto: " + this.codigo);
            // Lógica de persistencia (BD, archivo, etc.)
        }
    }

    @Override
    public void eliminar() {
        System.out.println("Eliminando producto: " + this.codigo);
    }

    @Override
    public void actualizar() {
        System.out.println("Actualizando producto: " + this.codigo);
    }
}
                      
pooabstraccioninterfaceimplements

SOLID - Single Responsibility (SRP)

Principio SRP: Una clase debe tener una sola razón para cambiar

solid_-_single_responsibility_(srp). java
61 líneas
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
                        /**
 * SOLID - SRP: Single Responsibility Principle
 * ❌ MAL: Una clase hace todo (validación, lógica, persistencia)
 * ✅ BIEN: Separar responsabilidades en clases especializadas
 */

// ❌ MAL - Clase con múltiples responsabilidades
public class EmpleadoMalo {
    public void guardarEnBaseDatos() { /* SQL aquí */ }
    public void validarDatos() { /* Validaciones */ }
    public void enviarEmailBienvenida() { /* Email */ }
    public double calcularSalario() { /* Cálculo */ }
    // Esta clase tiene 4 razones para cambiar!
}

// ✅ BIEN - Responsabilidades separadas

// Solo datos y comportamiento de negocio del empleado
public class Empleado {
    private String rut;
    private String nombre;
    private double salarioBase;

    public double calcularSalarioMensual() {
        return this.salarioBase;
    }
}

// Solo validaciones
public class EmpleadoValidator {
    public boolean validar(Empleado empleado) {
        return empleado.getRut() != null &&
               empleado.getNombre() != null &&
               empleado.getSalarioBase() > 0;
    }

    public List<String> obtenerErrores(Empleado empleado) {
        List<String> errores = new ArrayList<>();
        if (empleado.getRut() == null) errores.add("RUT requerido");
        return errores;
    }
}

// Solo persistencia
public class EmpleadoRepository {
    public void guardar(Empleado empleado) {
        // Solo lógica de base de datos
    }

    public Empleado buscarPorRut(String rut) {
        // Solo consulta BD
        return null;
    }
}

// Solo notificaciones
public class EmpleadoNotificador {
    public void enviarBienvenida(Empleado empleado) {
        // Solo lógica de email
    }
}
                      
solidsrpclean-codeprincipios

Excepciones Personalizadas

Manejo de errores con excepciones propias del dominio

excepciones_personalizadas. java
70 líneas
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
                        /**
 * Excepciones Personalizadas
 * Crear excepciones específicas del negocio para mejor manejo de errores
 */

// Excepción base del dominio
public class NegocioException extends RuntimeException {
    private final String codigo;

    public NegocioException(String codigo, String mensaje) {
        super(mensaje);
        this.codigo = codigo;
    }

    public String getCodigo() {
        return codigo;
    }
}

// Excepciones específicas
public class EmpleadoNoEncontradoException extends NegocioException {
    public EmpleadoNoEncontradoException(String rut) {
        super("EMP-001", "Empleado no encontrado con RUT: " + rut);
    }
}

public class ValidacionException extends NegocioException {
    private final List<String> errores;

    public ValidacionException(List<String> errores) {
        super("VAL-001", "Errores de validación");
        this.errores = errores;
    }

    public List<String> getErrores() {
        return errores;
    }
}

// Uso en el servicio
public class EmpleadoService {
    private final EmpleadoRepository repository;

    public Empleado buscarPorRut(String rut) {
        return repository.buscarPorRut(rut)
            .orElseThrow(() -> new EmpleadoNoEncontradoException(rut));
    }

    public void registrar(Empleado empleado) {
        List<String> errores = validator.obtenerErrores(empleado);
        if (!errores.isEmpty()) {
            throw new ValidacionException(errores);
        }
        repository.guardar(empleado);
    }
}

// Manejo en el controller
public class EmpleadoController {
    public void buscar(String rut) {
        try {
            Empleado emp = service.buscarPorRut(rut);
            mostrar(emp);
        } catch (EmpleadoNoEncontradoException e) {
            mostrarError("No encontrado: " + e.getMessage());
        } catch (ValidacionException e) {
            mostrarErrores(e.getErrores());
        }
    }
}
                      
excepcionestry-catchmanejo-errores

Spring Boot Controller

Controller REST básico con Spring Boot

spring_boot_controller. java
22 líneas
12345678910111213141516171819202122
                        @RestController
@RequestMapping("/api/usuarios")
public class UsuarioController {

    @Autowired
    private UsuarioService usuarioService;

    @GetMapping("/{id}")
    public ResponseEntity<Usuario> obtenerUsuario(@PathVariable Long id) {
        Usuario usuario = usuarioService.buscarPorId(id);
        if (usuario == null) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(usuario);
    }

    @PostMapping
    public ResponseEntity<Usuario> crearUsuario(@Valid @RequestBody Usuario usuario) {
        Usuario nuevo = usuarioService.guardar(usuario);
        return ResponseEntity.status(HttpStatus.CREATED).body(nuevo);
    }
}
                      
springrestcontroller

JPA Repository

Interface de repositorio con Spring Data JPA

jpa_repository. java
17 líneas
1234567891011121314151617
                        @Repository
public interface UsuarioRepository extends JpaRepository<Usuario, Long> {

    // Query methods
    Optional<Usuario> findByEmail(String email);

    List<Usuario> findByActivoTrue();

    // Query personalizada
    @Query("SELECT u FROM Usuario u WHERE u.nombre LIKE %:nombre%")
    List<Usuario> buscarPorNombre(@Param("nombre") String nombre);

    // Query nativa
    @Query(value = "SELECT * FROM usuarios WHERE created_at > :fecha",
           nativeQuery = true)
    List<Usuario> findRecientes(@Param("fecha") LocalDateTime fecha);
}
                      
jparepositorydatabase

Crear tabla con constraints

DDL para crear tabla con claves y restricciones

crear_tabla_con_constraints. sql
17 líneas
1234567891011121314151617
                        CREATE TABLE usuarios (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    fecha_nacimiento DATE,
    activo BOOLEAN DEFAULT true,
    rol_id INTEGER REFERENCES roles(id),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT chk_email CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')
);

-- Índices para mejorar rendimiento
CREATE INDEX idx_usuarios_email ON usuarios(email);
CREATE INDEX idx_usuarios_rol ON usuarios(rol_id);
                      
ddlcreateconstraints

Query con JOIN y agregación

Consulta compleja con múltiples JOINs

query_con_join_y_agregación. sql
14 líneas
1234567891011121314
                        SELECT
    d.nombre AS departamento,
    COUNT(e.id) AS total_empleados,
    AVG(e.salario) AS salario_promedio,
    MAX(e.salario) AS salario_maximo,
    MIN(e.fecha_contratacion) AS primera_contratacion
FROM departamentos d
LEFT JOIN empleados e ON d.id = e.departamento_id
WHERE e.activo = true
    AND e.fecha_contratacion >= '2023-01-01'
GROUP BY d.id, d.nombre
HAVING COUNT(e.id) > 5
ORDER BY total_empleados DESC
LIMIT 10;
                      
joinagregaciónselect

Fetch API con async/await

Consumir API REST con manejo de errores

fetch_api_con_async/await. js
32 líneas
1234567891011121314151617181920212223242526272829303132
                        async function fetchUsuarios() {
    try {
        const response = await fetch('https://api.ejemplo.com/usuarios', {
            method: 'GET',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': `Bearer ${token}`
            }
        });

        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }

        const data = await response.json();
        return data;

    } catch (error) {
        console.error('Error fetching usuarios:', error);
        throw error;
    }
}

// Uso con POST
async function crearUsuario(usuario) {
    const response = await fetch('https://api.ejemplo.com/usuarios', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(usuario)
    });
    return response.json();
}
                      
fetchasyncapi

React Hook personalizado

Custom hook para manejo de datos

react_hook_personalizado. js
34 líneas
12345678910111213141516171819202122232425262728293031323334
                        import { useState, useEffect } from 'react';

function useFetch(url) {
    const [data, setData] = useState(null);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);

    useEffect(() => {
        const abortController = new AbortController();

        async function fetchData() {
            try {
                setLoading(true);
                const response = await fetch(url, {
                    signal: abortController.signal
                });
                const json = await response.json();
                setData(json);
                setError(null);
            } catch (err) {
                if (err.name !== 'AbortError') {
                    setError(err.message);
                }
            } finally {
                setLoading(false);
            }
        }

        fetchData();
        return () => abortController.abort();
    }, [url]);

    return { data, loading, error };
}
                      
reacthookscustom

ES6 Módulos y Clases

Exportar/importar módulos y clases modernas

es6_módulos_y_clases. js
39 líneas
123456789101112131415161718192021222324252627282930313233343536373839
                        // usuario.js - Módulo con clase
export class Usuario {
    #password;  // Campo privado (ES2022)

    constructor(nombre, email) {
        this.nombre = nombre;
        this.email = email;
        this.createdAt = new Date();
    }

    // Getter
    get info() {
        return `${this.nombre} <${this.email}>`;
    }

    // Método estático
    static validarEmail(email) {
        return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
    }

    // Método async
    async guardar() {
        const response = await fetch('/api/usuarios', {
            method: 'POST',
            body: JSON.stringify(this)
        });
        return response.json();
    }
}

// Función helper exportada
export const formatearFecha = (fecha) =>
    new Intl.DateTimeFormat('es-CL').format(fecha);

// Export default
export default Usuario;

// En otro archivo:
// import Usuario, { formatearFecha } from './usuario.js';
                      
es6modulesclassesexportimport

Array Methods Funcionales

map, filter, reduce y encadenamiento

array_methods_funcionales. js
33 líneas
123456789101112131415161718192021222324252627282930313233
                        const productos = [
    { id: 1, nombre: 'Laptop', precio: 999, stock: 5 },
    { id: 2, nombre: 'Mouse', precio: 29, stock: 50 },
    { id: 3, nombre: 'Teclado', precio: 79, stock: 0 },
    { id: 4, nombre: 'Monitor', precio: 299, stock: 10 }
];

// filter - filtrar elementos
const enStock = productos.filter(p => p.stock > 0);

// map - transformar elementos
const nombres = productos.map(p => p.nombre);

// find - encontrar uno
const laptop = productos.find(p => p.id === 1);

// reduce - agregar a un valor
const totalInventario = productos.reduce(
    (total, p) => total + (p.precio * p.stock), 0
);

// Encadenamiento (chaining)
const resumen = productos
    .filter(p => p.stock > 0)
    .map(p => ({
        nombre: p.nombre,
        valor: p.precio * p.stock
    }))
    .sort((a, b) => b.valor - a.valor);

// some / every - validaciones
const hayAgotados = productos.some(p => p.stock === 0);
const todosDisponibles = productos.every(p => p.stock > 0);
                      
arrayfunctionalmapfilterreduce
main UTF-8
Snippets: 18 Languages: 4

Recursos de Aprendizaje 2025

Libros, cursos y comunidades recomendados por la industria