Learn in 10 minutes

Learn in 10 minutes

Aprende JavaScript en 10 minutos

JavaScript es un lenguaje de programación interpretado de alto nivel conocido por su versatilidad y uso generalizado en el desarrollo web. Este tutorial cubre las características modernas de JavaScript (ES6+) para ayudarte a aprender rápidamente el lenguaje.

1. Escribiendo tu primer programa en JavaScript

Comencemos con un programa simple. Crea un archivo llamado hello.js e ingresa el siguiente código:

console.log("Hello, World!");

Guarda el archivo y ejecuta el siguiente comando en la terminal o línea de comandos:

node hello.js

O inclúyelo en un archivo HTML:

<script>
  console.log("Hello, World!");
</script>

La salida será:

Hello, World!

Este programa simple demuestra la funcionalidad básica de salida de JavaScript. La función console.log() se utiliza para mostrar información de texto en la consola.

2. Sintaxis básica

La sintaxis de JavaScript es similar a otros lenguajes de estilo C. Utiliza punto y coma para terminar declaraciones y llaves {} para definir bloques de código.

// Este es un comentario de una línea
console.log("Hello, World!");

/*
Este es un comentario
multilínea que abarca
varias líneas.
*/

Reglas básicas de sintaxis en JavaScript:

  • Punto y coma: Opcional pero recomendado para terminar declaraciones
  • Comentarios: Los comentarios de una línea comienzan con //, los multilínea con /* */
  • Sensibilidad a mayúsculas: JavaScript distingue entre mayúsculas y minúsculas
  • Bloques de código: Definidos por llaves {}

3. Variables y tipos de datos

En JavaScript, las variables se declaran usando let, const o var. JavaScript moderno prefiere let y const.

Declaración de variables:

let name = "John"; // Variable mutable
const age = 25;     // Constante inmutable
var oldWay = "deprecated"; // Evita usar var

Principales tipos de datos de JavaScript:

  • Number: 42, 3.14, -10
  • String: "hello", 'world', `template`
  • Boolean: true, false
  • Undefined: undefined (variable declarada pero no asignada)
  • Null: null (ausencia intencional de valor)
  • Object: {key: "value"}, [1, 2, 3]
  • Symbol: Symbol("description") (ES6+)
  • BigInt: 1234567890123456789012345678901234567890n (ES2020+)

3.1 Tipo Number

JavaScript utiliza números de punto flotante de 64 bits para todos los valores numéricos.

let integer = 42;
let float = 3.14159;
let scientific = 2.5e3; // 2500
let hex = 0xFF;         // 255
let binary = 0b1010;    // 10
let octal = 0o10;       // 8

3.2 Tipo String

Las cadenas se pueden crear con comillas simples, comillas dobles o literales de plantilla.

let single = 'Cadena con comillas simples';
let double = "Cadena con comillas dobles";
let template = `Literal de plantilla`;

// Literales de plantilla con interpolación
let name = "Alice";
let greeting = `¡Hola, ${name}!`; // "¡Hola, Alice!"

Operaciones con cadenas:

let text = "Programación JavaScript";
console.log(text.length);        // Longitud: 21
console.log(text.toUpperCase()); // "PROGRAMACIÓN JAVASCRIPT"
console.log(text.toLowerCase()); // "programación javascript"
console.log(text[0]);            // Primer carácter: "P"
console.log(text.slice(0, 10)); // "Programación"

3.3 Tipo Boolean

El tipo booleano tiene dos valores: true y false.

let isActive = true;
let isComplete = false;

// Operaciones booleanas
let result1 = true && false;  // false
let result2 = true || false;  // true
let result3 = !true;          // false

3.4 Undefined y Null

undefined significa que una variable ha sido declarada pero no se le ha asignado un valor. null es una ausencia intencional de cualquier valor.

let unassigned; // undefined
let empty = null;

if (unassigned === undefined) {
  console.log("Variable no definida");
}

if (empty === null) {
  console.log("Valor nulo");
}

4. Estructuras de datos

4.1 Array

Los arrays son colecciones ordenadas y mutables de valores.

let numbers = [1, 2, 3, 4, 5];
numbers.push(6);        // Agregar elemento: [1, 2, 3, 4, 5, 6]
numbers.pop();          // Eliminar último: [1, 2, 3, 4, 5]
numbers.unshift(0);     // Agregar al inicio: [0, 1, 2, 3, 4, 5]
numbers.shift();        // Eliminar primero: [1, 2, 3, 4, 5]
numbers[0] = 10;        // Modificar: [10, 2, 3, 4, 5]

Métodos de array:

let fruits = ["manzana", "banana", "naranja"];

// Iteración
fruits.forEach(fruit => console.log(fruit));

// Transformación
let lengths = fruits.map(fruit => fruit.length); // [7, 6, 7]

// Filtrado
let longFruits = fruits.filter(fruit => fruit.length > 6); // ["manzana", "naranja"]

// Búsqueda
let hasApple = fruits.includes("manzana"); // true
let bananaIndex = fruits.indexOf("banana"); // 1

4.2 Object

Los objetos son colecciones de pares clave-valor.

let person = {
  name: "John",
  age: 30,
  city: "Nueva York",
  isStudent: false
};

// Accediendo a propiedades
console.log(person.name);       // "John"
console.log(person["age"]);     // 30

// Agregando propiedades
person.country = "USA";
person["occupation"] = "Desarrollador";

// Eliminando propiedades
delete person.isStudent;

// Métodos de objeto
let keys = Object.keys(person);    // ["name", "age", "city", "country", "occupation"]
let values = Object.values(person); // ["John", 30, "Nueva York", "USA", "Desarrollador"]
let entries = Object.entries(person); // [["name", "John"], ["age", 30], ...]

4.3 Set

Los sets son colecciones de valores únicos.

let numbers = new Set([1, 2, 3, 3, 4, 4, 5]);
console.log(numbers); // Set {1, 2, 3, 4, 5}

// Operaciones con sets
numbers.add(6);       // Agregar valor
numbers.delete(1);    // Eliminar valor
numbers.has(2);       // true
numbers.size;         // 5

// Iterando
numbers.forEach(num => console.log(num));

4.4 Map

Los maps son colecciones de pares clave-valor con cualquier tipo de dato como clave.

let map = new Map();
map.set("name", "Alice");
map.set(1, "número uno");
map.set(true, "booleano verdadero");

console.log(map.get("name"));    // "Alice"
console.log(map.has(1));         // true
console.log(map.size);           // 3

// Iterando
for (let [key, value] of map) {
  console.log(`${key}: ${value}`);
}

5. Operadores

JavaScript proporciona varios operadores para cálculos y comparaciones.

  • Aritméticos: +, -, *, /, %, ** (exponenciación)
  • Comparación: ==, ===, !=, !==, >, <, >=, <=
  • Lógicos: &&, ||, !
  • Asignación: =, +=, -=, *=, /=, %=
  • Ternario: condición ? expr1 : expr2

5.1 Operadores aritméticos

let a = 10, b = 3;

console.log(a + b);   // 13
console.log(a - b);   // 7
console.log(a * b);   // 30
console.log(a / b);   // 3.333...
console.log(a % b);   // 1
console.log(a ** b);  // 1000

5.2 Operadores de comparación

let x = 5, y = 10;

console.log(x == y);    // false
console.log(x === y);   // false (igualdad estricta)
console.log(x != y);    // true
console.log(x !== y);   // true (desigualdad estricta)
console.log(x > y);     // false
console.log(x < y);     // true
console.log(x >= y);    // false
console.log(x <= y);    // true

5.3 Operadores lógicos

let a = true, b = false;

console.log(a && b);   // false
console.log(a || b);   // true
console.log(!a);       // false

6. Control de flujo

6.1 Sentencias if

let age = 20;

if (age >= 18) {
  console.log("Adulto");
} else if (age >= 13) {
  console.log("Adolescente");
} else {
  console.log("Niño");
}

6.2 Sentencia switch

let day = "Monday";

switch (day) {
  case "Monday":
    console.log("Inicio de semana");
    break;
  case "Friday":
    console.log("Casi fin de semana");
    break;
  default:
    console.log("Día regular");
}

6.3 Bucles for

// Bucle for tradicional
for (let i = 0; i < 5; i++) {
  console.log(i); // 0, 1, 2, 3, 4
}

// Bucle for...of (arrays, strings)
let fruits = ["manzana", "banana", "naranja"];
for (let fruit of fruits) {
  console.log(fruit);
}

// Bucle for...in (propiedades de objeto)
let person = {name: "John", age: 30};
for (let key in person) {
  console.log(`${key}: ${person[key]}`);
}

6.4 Bucles while

// Bucle while
let count = 0;
while (count < 5) {
  console.log(count);
  count++;
}

// Bucle do...while
let i = 0;
do {
  console.log(i);
  i++;
} while (i < 5);

6.5 break y continue

for (let i = 0; i < 10; i++) {
  if (i === 5) {
    break; // Salir del bucle
  }
  if (i % 2 === 0) {
    continue; // Saltar números pares
  }
  console.log(i); // 1, 3
}

7. Funciones

Las funciones son bloques de código reutilizables.

7.1 Declaración de funciones

function greet(name) {
  return `¡Hola, ${name}!`;
}

console.log(greet("Alice")); // "¡Hola, Alice!"

7.2 Expresiones de función

const multiply = function(a, b) {
  return a * b;
};

console.log(multiply(4, 5)); // 20

7.3 Funciones flecha (ES6+)

const add = (a, b) => a + b;
const square = x => x * x;
const greet = name => `¡Hola, ${name}!`;

console.log(add(2, 3));      // 5
console.log(square(4));      // 16
console.log(greet("Bob"));   // "¡Hola, Bob!"

7.4 Parámetros por defecto

function createUser(name, age = 18, isActive = true) {
  return {name, age, isActive};
}

console.log(createUser("John"));        // {name: "John", age: 18, isActive: true}
console.log(createUser("Alice", 25));  // {name: "Alice", age: 25, isActive: true}

7.5 Parámetros rest

function sum(...numbers) {
  return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3, 4)); // 10
console.log(sum(5, 10, 15));  // 30

7.6 Operador de propagación

let numbers = [1, 2, 3];
let moreNumbers = [4, 5, 6];
let allNumbers = [...numbers, ...moreNumbers]; // [1, 2, 3, 4, 5, 6]

let person = {name: "John", age: 30};
let updatedPerson = {...person, city: "Nueva York"}; // {name: "John", age: 30, city: "Nueva York"}

8. Clases y objetos (ES6+)

8.1 Declaración de clase

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  introduce() {
    return `Soy ${this.name}, tengo ${this.age} años`;
  }

  haveBirthday() {
    this.age++;
    return `${this.name} cumplió años, ahora tiene ${this.age} años`;
  }
}

let person = new Person("John", 25);
console.log(person.introduce());      // "Soy John, tengo 25 años"
console.log(person.haveBirthday());   // "John cumplió años, ahora tiene 26 años"

8.2 Herencia

class Animal {
  constructor(name, species) {
    this.name = name;
    this.species = species;
  }

  makeSound() {
    return `${this.name} hace un sonido`;
  }
}

class Dog extends Animal {
  constructor(name, breed) {
    super(name, "Perro");
    this.breed = breed;
  }

  makeSound() {
    return `${this.name} ladra`;
  }

  fetch() {
    return `${this.name} busca la pelota`;
  }
}

let dog = new Dog("Buddy", "Golden Retriever");
console.log(dog.makeSound()); // "Buddy ladra"
console.log(dog.fetch());     // "Buddy busca la pelota"

8.3 Getters y Setters

class Circle {
  constructor(radius) {
    this.radius = radius;
  }

  get diameter() {
    return this.radius * 2;
  }

  set diameter(diameter) {
    this.radius = diameter / 2;
  }

  get area() {
    return Math.PI * this.radius ** 2;
  }
}

let circle = new Circle(5);
console.log(circle.diameter); // 10
console.log(circle.area);     // 78.53981633974483

circle.diameter = 20;
console.log(circle.radius);   // 10

9. JavaScript asíncrono

9.1 Callbacks

function fetchData(callback) {
  setTimeout(() => {
    callback("Datos recibidos");
  }, 1000);
}

fetchData(data => {
  console.log(data); // "Datos recibidos" después de 1 segundo
});

9.2 Promesas

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve("Datos recibidos");
      // reject("Error ocurrido");
    }, 1000);
  });
}

fetchData()
  .then(data => console.log(data)) // "Datos recibidos"
  .catch(error => console.error(error));

9.3 async/await (ES2017+)

async function getData() {
  try {
    let data = await fetchData();
    console.log(data); // "Datos recibidos"
  } catch (error) {
    console.error(error);
  }
}

getData();

9.4 Fetch API

async function getUser() {
  try {
    let response = await fetch('https://api.example.com/user');
    let user = await response.json();
    console.log(user);
  } catch (error) {
    console.error('Error:', error);
  }
}

10. Manejo de errores

try {
  let result = 10 / 0;
  if (!isFinite(result)) {
    throw new Error("División por cero");
  }
  console.log(result);
} catch (error) {
  console.error("Error:", error.message);
} finally {
  console.log("Esto siempre se ejecuta");
}

11. Módulos (ES6+)

11.1 Exportación

// math.js
export const PI = 3.14159;

export function add(a, b) {
  return a + b;
}

export default function multiply(a, b) {
  return a * b;
}

11.2 Importación

// main.js
import multiply, { PI, add } from './math.js';

console.log(PI);           // 3.14159
console.log(add(2, 3));    // 5
console.log(multiply(4, 5)); // 20

12. Características modernas de JavaScript

12.1 Desestructuración

// Desestructuración de array
let [first, second, third] = [1, 2, 3];
console.log(first, second, third); // 1 2 3

// Desestructuración de objeto
let {name, age} = {name: "John", age: 30, city: "NY"};
console.log(name, age); // John 30

// Desestructuración de parámetros de función
function greet({name, age}) {
  return `Hola ${name}, tienes ${age} años`;
}

12.2 Literales de plantilla

let name = "Alice";
let age = 25;

// Interpolación básica
let greeting = `¡Hola, ${name}!`;

// Cadenas multilínea
let message = `
  Nombre: ${name}
  Edad: ${age}
  Estado: ${age >= 18 ? "Adulto" : "Menor"}
`;

// Evaluación de expresiones
let calculation = `2 + 3 = ${2 + 3}`; // "2 + 3 = 5"

12.3 Encadenamiento opcional (?.)

let user = {
  profile: {
    name: "John",
    address: {
      city: "Nueva York"
    }
  }
};

console.log(user?.profile?.name);           // "John"
console.log(user?.profile?.age);            // undefined
console.log(user?.profile?.address?.city);  // "Nueva York"
console.log(user?.employment?.company);     // undefined (sin error)

12.4 Fusión de nulos (??)

let name = "";
let age = 0;
let city = null;
let country = undefined;

console.log(name || "Desconocido");    // "Desconocido" (cadena vacía es falsy)
console.log(name ?? "Desconocido");    // "" (solo null/undefined)

console.log(age || 18);           // 18 (0 es falsy)
console.log(age ?? 18);           // 0 (solo null/undefined)

console.log(city ?? "Desconocido");   // "Desconocido"
console.log(country ?? "USA");    // "USA"

13. Métodos útiles de arrays

let numbers = [1, 2, 3, 4, 5];

// map: transformar cada elemento
let squares = numbers.map(n => n * n); // [1, 4, 9, 16, 25]

// filter: seleccionar elementos
let evens = numbers.filter(n => n % 2 === 0); // [2, 4]

// reduce: acumular valores
let sum = numbers.reduce((total, n) => total + n, 0); // 15

// find: encontrar primer elemento coincidente
let firstEven = numbers.find(n => n % 2 === 0); // 2

// some: verificar si algún elemento coincide
let hasEven = numbers.some(n => n % 2 === 0); // true

// every: verificar si todos los elementos coinciden
let allPositive = numbers.every(n => n > 0); // true

// sort: ordenar elementos
let sorted = numbers.sort((a, b) => b - a); // [5, 4, 3, 2, 1]

14. Fechas y horas

let now = new Date();
console.log(now.toString());      // Fecha y hora actual
console.log(now.getFullYear());   // Año actual
console.log(now.getMonth());      // Mes actual (0-11)
console.log(now.getDate());       // Día actual (1-31)
console.log(now.getHours());      // Hora actual (0-23)

// Formateo de fechas
console.log(now.toLocaleDateString()); // Cadena de fecha localizada
console.log(now.toLocaleTimeString()); // Cadena de hora localizada
console.log(now.toISOString());        // Cadena en formato ISO

// Creación de fechas específicas
let specificDate = new Date(2025, 0, 1); // 1 de enero de 2025
let timestamp = new Date(1640995200000); // Desde timestamp

15. Expresiones regulares

let text = "Hola, mi correo es [email protected] y mi teléfono es 123-456-7890";

// Patrón de email
let emailPattern = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
let emails = text.match(emailPattern); // ["[email protected]"]

// Patrón de teléfono
let phonePattern = /\d{3}-\d{3}-\d{4}/g;
let phones = text.match(phonePattern); // ["123-456-7890"]

// Método test
let isValidEmail = emailPattern.test("[email protected]"); // true

// Método replace
let maskedText = text.replace(phonePattern, "XXX-XXX-XXXX");
console.log(maskedText);

JavaScript es un lenguaje poderoso y versátil que continúa evolucionando. Este tutorial cubre los conceptos esenciales para comenzar, pero hay mucho más por explorar, incluidos temas avanzados como generadores, proxies y APIs web.