Origen y Evolución:
JavaScript nació como un lenguaje de scripting para el navegador,
añadiendo interactividad a las páginas web. Con la llegada de NodeJS, se
expandió hacia el desarrollo de aplicaciones de escritorio y
servidores.
ES6 / ECMAScript 2015:
Esta versión del lenguaje introduce mejoras significativas en la
sintaxis y nuevas funcionalidades que permiten escribir código más
limpio, modular y eficiente.
Ejemplo Básico:
// Uso de let y template literals (cadenas interpoladas)
let saludo = "Hola";
let nombre = "Mundo";
console.log(`${saludo}, ${nombre}!`); // Imprime: Hola, Mundo!Inclusión de JavaScript:
Embebido: Directamente en HTML con
<script>.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Ejemplo Embebido</title>
</head>
<body>
<script>
console.log("Código embebido en el documento HTML");
</script>
</body>
</html>Externo: Mediante archivos .js
independientes.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Ejemplo Externo</title>
</head>
<body>
<script src="app.js"></script>
</body>
</html>Comentarios:
///* ... */Ejemplo:
// Comentario de una línea
/*
Comentario de varias líneas.
Se usa para documentar o desactivar bloques de código.
*/Salida de Información:
console.log(texto)alert(texto)console.log("Mensaje en la consola");
alert("Mensaje en una alerta");let:
Tiene ámbito de bloque ({ }). Se recomienda su uso para
evitar problemas en el alcance.
{
let mensaje = "Dentro del bloque";
console.log(mensaje); // "Dentro del bloque"
}
// console.log(mensaje); // Error: mensaje no está definido fuera del bloquevar:
Tiene ámbito de función o global, y permite redeclaración. Su uso es
menos seguro.
function ejemploVar() {
var valor = "Primera asignación";
if (true) {
var valor = "Reasignado en el mismo contexto";
console.log(valor); // "Reasignado en el mismo contexto"
}
console.log(valor); // "Reasignado en el mismo contexto"
}
ejemploVar();Se definen con const y su valor no cambiará (aunque,
en caso de objetos o arrays, las propiedades internas pueden
modificarse).
const PI = 3.1416;
console.log(PI); // 3.1416
const numeros = [1, 2, 3];
numeros.push(4); // Modifica el array, pero no se puede reasignar
console.log(numeros); // [1, 2, 3, 4]
// numeros = [5, 6, 7]; // Error: no se puede cambiar la referencia de la constanteNuméricos:
Enteros, decimales y bigint para números muy grandes.
let entero = 42;
let decimal = 3.14;
let enteroGrande = BigInt(9007199254740991);Booleanos:
Solo pueden ser true o false.
let esActivo = true;
let estaCompleto = false;Cadenas (Strings):
Definidas entre comillas simples o dobles. Se pueden concatenar usando
el operador + o template strings.
let texto = "Bienvenido a JavaScript";
let otraCadena = 'Sigue programando';
console.log(texto + " y " + otraCadena);Otros Tipos Primitivos:
undefined: Variable declarada sin asignar valor.null: Ausencia intencional de valor.symbol: Valor único e inmutable.let sinValor;
console.log(sinValor); // undefined
let valorNulo = null;
console.log(valorNulo); // null
let idUnico = Symbol("id");
console.log(idUnico); // Symbol(id)Objetos:
Conjuntos de propiedades y métodos.
let persona = {
nombre: "Carlos",
edad: 28
};
console.log(persona.nombre); // "Carlos"Coerción Implícita vs. Explícita:
JavaScript convierte tipos según el contexto, pero es recomendable
hacerlo explícitamente.
let numComoCadena = "42";
let numero = parseInt(numComoCadena);
console.log(numero + 8); // 50Comparaciones:
== y !=: Comparación con coerción (no
recomendado).=== y !==: Comparación estricta (valor y
tipo).console.log(5 == "5"); // true (conversión implícita)
console.log(5 === "5"); // false"use strict")El modo estricto impone reglas más estrictas para escribir un código más fiable y seguro.
Alcance Global:
"use strict";
// x = 10; // Error: x no está declaradoModo Estricto en Funciones:
function ejemploStrict() {
"use strict";
let x = 10;
console.log(x); // Correcto
// y = 20; // Error: y no está declarado
}
ejemploStrict();Características principales: - Obliga a declarar
todas las variables. - Prohíbe el uso de delete para
remover variables, objetos o funciones. - Impide nombres duplicados en
parámetros de funciones. - Evita escribir en propiedades de solo lectura
o usar palabras reservadas.
JavaScript ofrece diversos métodos para interactuar con el usuario y depurar el código:
alert(texto):
Muestra un mensaje en un cuadro de diálogo básico.
alert("Bienvenido a la página!");console.log(texto):
Imprime un mensaje en la consola del navegador.
console.log("Este es un mensaje en la consola");confirm(pregunta):
Presenta un diálogo con opciones de Aceptar/Cancelar y devuelve
true o false.
let continuar = confirm("¿Deseas continuar?");
console.log("Respuesta del usuario:", continuar);prompt(mensaje, valorPorDefecto):
Permite al usuario introducir un dato en un campo de texto. Devuelve una
cadena o null si se cancela.
let nombreUsuario = prompt("Introduce tu nombre:", "Invitado");
console.log("Hola, " + nombreUsuario + "!");Los operadores se utilizan para realizar asignaciones, cálculos y comparaciones. Se dividen en varias categorías:
let a = 10;
a += 5; // Equivalente a: a = a + 5
console.log(a); // 15console.log(2 + 3); // Suma: 5
console.log(10 - 4); // Resta: 6
console.log(3 * 4); // Multiplicación: 12
console.log(12 / 4); // División: 3
console.log(10 % 3); // Módulo (resto): 1let i = 5;
console.log(++i); // Pre-incremento: incrementa y luego imprime (6)
console.log(i++); // Post-incremento: imprime 6 y luego incrementa
console.log(i); // Ahora i es 7let num = 5;
let str = "5";
console.log(num == str); // true, con conversión implícita
console.log(num === str); // false, comparación estricta
console.log(10 > 5); // true
console.log(3 <= 2); // falseconsole.log(true && false); // false
console.log(true || false); // true
console.log(!true); // falseAcceden a las propiedades o métodos de un objeto.
let estudiante = {
nombre: "Lucía",
curso: "JavaScript"
};
console.log(estudiante.nombre); // Acceso por notación de punto
console.log(estudiante["curso"]); // Acceso por notación de corchetes
delete estudiante.curso;
console.log(estudiante); // { nombre: "Lucía" }Operador de Coma: Evalúa varias expresiones y devuelve la última.
let resultado = (1, 2, 3);
console.log(resultado); // 3Operador Ternario: Simplifica condicionales if-else.
let edad = 18;
let mensaje = (edad >= 18) ? "Mayor de edad" : "Menor de edad";
console.log(mensaje); // "Mayor de edad"typeof: Retorna el tipo de dato de
una variable.
console.log(typeof mensaje); // "string"Las estructuras de control permiten alterar el flujo secuencial del código, ya sea mediante condiciones o bucles.
if / else)let numero = 10;
if (numero > 0) {
console.log("El número es positivo");
} else if (numero < 0) {
console.log("El número es negativo");
} else {
console.log("El número es cero");
}Condicionales anidados:
let edad = 20;
let tienePermiso = true;
if (edad >= 18) {
if (tienePermiso) {
console.log("Puedes entrar a la fiesta");
} else {
console.log("Necesitas un permiso de tus padres");
}
} else {
console.log("No eres mayor de edad");
}Bucle for:
for (let i = 0; i < 5; i++) {
console.log("Iteración:", i);
}Bucle while:
let contador = 0;
while (contador < 5) {
console.log("Contador:", contador);
contador++; // Asegura la terminación del bucle
}Bucle do-while:
let intento = 0;
do {
console.log("Ejecutando intento:", intento);
intento++;
} while (intento < 3);break
y continuebreak: Finaliza abruptamente el
bucle.continue: Salta la iteración actual y
continúa con la siguiente.for (let i = 0; i < 10; i++) {
if (i === 5) {
break; // Sale del bucle cuando i es 5
}
if (i % 2 === 0) {
continue; // Salta la iteración actual si i es par
}
console.log("Valor impar:", i);
}Los arrays son colecciones ordenadas de valores y proporcionan numerosos métodos para su manipulación.
let numeros = [1, 2, 3, 4, 5];
let letras = new Array("a", "b", "c");
console.log(numeros.length); // 5
console.log(numeros[0]); // 1Arrays bidimensionales:
let matriz = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
console.log(matriz[1][2]); // 6Referencia compartida:
let copiaReferencia = numeros;Copia simple (spread operator):
let copiaNumeros = [...numeros];Copia profunda (para arrays anidados):
let copiaProfunda = JSON.parse(JSON.stringify(matriz));let frutas = ["manzana", "banana"];
frutas.push("naranja"); // Agrega al final
let ultima = frutas.pop(); // Extrae del final
frutas.unshift("fresa"); // Agrega al inicio
let primera = frutas.shift(); // Extrae del iniciolet elementos = ["a", "b", "c", "d"];
// splice: elimina y reemplaza elementos
elementos.splice(2, 2, "z"); // Resultado: ["a", "b", "z"]
// slice: extrae una porción del array sin modificar el original
let subArray = elementos.slice(0, 2); // ["a", "b"]
// concat: une arrays
let combinado = elementos.concat(["x", "y"]); // ["a", "b", "z", "x", "y"]Bucle clásico:
for (let i = 0; i < elementos.length; i++) {
console.log(elementos[i]);
}for...of:
for (let valor of elementos) {
console.log(valor);
}for...in:
for (let indice in elementos) {
console.log(`Índice ${indice}: ${elementos[indice]}`);
}forEach():
elementos.forEach((el, idx) => {
console.log(`Elemento ${idx}:`, el);
});indexOf / lastIndexOf:
let indices = ["a", "b", "a"];
console.log(indices.indexOf("a")); // 0
console.log(indices.lastIndexOf("a")); // 2includes:
console.log(indices.includes("c")); // falsefind y findIndex:
let objetos = [{ id: 1 }, { id: 2 }, { id: 3 }];
let encontrado = objetos.find(obj => obj.id === 2); // { id: 2 }
let posicion = objetos.findIndex(obj => obj.id === 2); // 1filter:
let numerosPares = numeros.filter(num => num % 2 === 0);
console.log(numerosPares);map:
let cuadrados = numeros.map(num => num * num);
console.log(cuadrados);sort y reverse:
Estos métodos modifican el array original.
let letrasOrdenadas = ["d", "b", "a", "c"];
letrasOrdenadas.sort(); // ["a", "b", "c", "d"]
letrasOrdenadas.reverse(); // ["d", "c", "b", "a"]split y join:
let cadena = "hola,como,estas";
let arrCadena = cadena.split(","); // ["hola", "como", "estas"]
let nuevaCadena = arrCadena.join(" "); // "hola como estas"Las funciones permiten agrupar un conjunto de instrucciones bajo un nombre para reutilizarlas y organizar mejor el código.
Función Declarada (hoisting):
console.log(saludo("Mundo"));
function saludo(nombre) {
return `Hola, ${nombre}!`;
}Función por Expresión:
const despedida = function(nombre) {
return `Adiós, ${nombre}!`;
};
console.log(despedida("Amigo"));Constructor de Funciones:
const suma = new Function("a", "b", "return a + b");
console.log(suma(5, 7)); // 12function multiplicar(a, b = 2) {
return a * b;
}
console.log(multiplicar(5)); // 10REST Parameters:
function sumarTodos(...numeros) {
return numeros.reduce((acum, num) => acum + num, 0);
}
console.log(sumarTodos(1, 2, 3, 4)); // 10Spread Operator:
const datos = [10, 20, 30];
console.log(Math.max(...datos)); // 30// Sintaxis compacta con retorno implícito
const doble = numero => numero * 2;
console.log(doble(4)); // 8
// Con múltiples parámetros y cuerpo de función
const sumar = (a, b) => {
let resultado = a + b;
return resultado;
};
console.log(sumar(5, 6)); // 11Las clases introducen la forma de definir plantillas para crear objetos, integrando propiedades, métodos y herencia de forma ordenada.
class Persona {
// Constructor que inicializa la instancia
constructor(nombre, edad) {
this.nombre = nombre;
this.edad = edad;
}
// Método de instancia
presentarse() {
return `Hola, soy ${this.nombre} y tengo ${this.edad} años.`;
}
// Método estático: se usa directamente desde la clase
static crearAnonimo() {
return new Persona("Anónimo", 0);
}
// Getter para verificación de mayor edad
get esMayor() {
return this.edad >= 18;
}
}
const persona1 = new Persona("Laura", 25);
console.log(persona1.presentarse());
console.log(`¿Es mayor? ${persona1.esMayor}`);
const anonimo = Persona.crearAnonimo();
console.log(anonimo.presentarse());Iteradores y Generadores:
Permiten definir secuencias personalizadas.
const iterable = {
[Symbol.iterator]: function* () {
yield 1;
yield 2;
yield 3;
}
};
for (const valor of iterable) {
console.log(valor); // 1, luego 2, luego 3
}Template Strings:
Facilitan la interpolación de variables en cadenas.
const usuario = "Ana";
const mensaje = `Bienvenida, ${usuario}!`;
console.log(mensaje);For…of:
Útil para recorrer cualquier iterable (arrays, strings, etc.).
const letras = "JavaScript";
for (const letra of letras) {
console.log(letra);
}Tail Call Optimization:
Una técnica para optimizar llamadas recursivas.
function sumarRecursivo(n, acumulador = 0) {
if (n === 0) return acumulador;
return sumarRecursivo(n - 1, acumulador + n);
}
console.log(sumarRecursivo(5)); // 15El DOM (Document Object Model) representa la estructura HTML de una página y permite modificarla dinámicamente.
Acceder a Elementos:
// Suponiendo la existencia de <div id="contenido">Texto inicial</div> en el HTML
const elemento = document.getElementById("contenido");
console.log(elemento.innerHTML); // "Texto inicial"Modificar Propiedades:
// Cambiar la imagen de un elemento <img id="foto">
const imagen = document.getElementById("foto");
imagen.src = "ruta/nueva-imagen.jpg";Añadir Elementos al DOM:
const nuevoParrafo = document.createElement("p");
nuevoParrafo.textContent = "Este es un párrafo añadido dinámicamente.";
document.body.appendChild(nuevoParrafo);Para profundizar en JavaScript, te recomiendo las siguientes fuentes y recursos:
Documentación y Referencias:
Depuración en la Consola Web:
Utiliza herramientas como console.log(),
console.table(), console.error(), entre
otros.
Plataformas de Práctica:
Sitios como FreeCodeCamp, Codewars y HackerRank son ideales para poner a
prueba lo aprendido.