Para iniciar con un buen desarrollo en este lenguaje, es recomendable activar el modo estricto al principio del script. Esta directiva previene errores sutiles provocados por prácticas ambiguas o asignaciones accidentales. Además, se recomienda encarecidamente la creación de variables locales utilizando la palabra clave let para mantener la integridad del ámbito.
'use strict';
let contador = 1;
Recorrido de Colecciones
La iteración sobre estructuras de datos es una tarea común. El operador for...of facilita el acceso directo a los valores dentro de arreglos, mapas y conjuntos, a diferencia del índice tradicional utilizado por for...in.
Iteración sobre Arreglos
'use strict';
const listaValores = [10, 20, 30];
for (const item of listaValores) {
console.log(item);
}
Iteración sobre Mapas
Las estructuras tipo mapa almacenan pares clave-valor.
const registroClientes = new Map([
["cliente_alfa", 50],
["cliente_beta", 100],
["cliente_gamma", 150]
]);
for (const par of registroClientes) {
console.log(par);
}
Iteración sobre Sets
Los conjuntos solo permiten valores únicos sin duplicados.
const conjuntoUnico = new Set([5, 10, 15]);
for (const valor of conjuntoUnico) {
console.log(valor);
}
Declaración y Manipulación de Funciones
Existen dos sintaxis principales para crear funicones. La primera utiliza la palabra clave directa function, mientras que la segunda utiliza expresiones anónimas asignadas a variables.
Estilo Declarativo:
function procesarDato(numeros){ if (numeros >= 0){ return numeros; } else { return -numeros; } }
Una función finaliza su ejecución inmediatamente al encontrar una instrucción return. Si no existe dicha instrucción, el retorno implícito es undefined.
Expresión Anónima:
const funcionGenerica = function (entrada) { if (entrada >= 0){ return entrada; } else { return -entrada; } };
JavaScript permite transmitir cualquier cantidad de argumentos o ninguno. Es posible realizar validaciones internas lanzando excepciones si los tipos de datos no son los esperados.
const validarEntrada = function (input) {
if (typeof input !== 'number'){
throw 'Error: El valor debe ser numérico';
}
// Lógica continua...
return input;
};
Existe un argumento especial accesible internamente denominado arguments, que contiene todos los parámetros pasados.
Ámbitos y Alcance de Variables
La keyword var define variables con un alcance funcional. Una vez declarada dentro de un bloque, esta variable no es accesible desde fuera de dicho contexto.
function areaInterna(){
var datoLocal = 10;
}
datoLocal + 5; // Generará un error de referencia
Sin embargo, diferentes funciones pueden declarar variables con el mismo nombre sin conflictuarse, ya que cada una mantiene su propio entorno local.
function bloqueUno(){
var contador = 1;
}
function bloqueDos(){
var contador = 2;
}
Los procedimientos internos tienen permisos de lectura sobre las variables definidas en sus padres (closure), pero esto implica buscar hacia arriba en el árbol de funciones.
Hoisting (Asunción de Código)
El motor de JS eleva las declaraciones de variables antes de ejecutar el código. Sin embargo, no eleva la asignación de valores.
function pruebaHoisting(){
var cadenaX = textoY + "final";
console.log(cadenaX);
var textoY = "inicio";
}
El resultado mostrará undefined-final, debido a que la declaración se mueve arriba, pero la asignación permanece en su sitio. Para evitar confusiones, se aconseja definir todas las variables al inicio de la función.
Las variables declaradas fuera de cualquier función residen en el ámbito global, asociado automáticamente al objeto window en navegadores. Cualquier script externo comparte este espacio, lo cual puede causar colisiones de nombres.
// Evitar conflicto global usando un namespace
var NamespaceGlobal = {};
NamespaceGlobal.ruta = "/data";
NamespaceGlobal.suma = function(a, b){ return a + b; };
En JavaScript moderno, las palabras clave let y const ayudan a mitigar problemas de alcances temporales y preventivos de cambios inesperados.
Métodos y Contexto (this)
Una función almacenada dentro de un objeto se denomina método. Al invocarla, es crucial entender a qué objeto apunta el contexto this.
const perfilUsuario = {
fechaNacimiento: 1995,
calcularAnios: function () {
const ahora = new Date().getFullYear();
return ahora - this.fechaNacimiento;
}
};
perfilUsuario.calcularAnios();
Puede controlar explícitamente el valor de this utilizando métodos como apply.
function edadCalculada() {
const hoy = new Date().getFullYear();
return hoy - this.añoNacimiento;
}
const objetoDatos = { añoNacimiento: 2000 };
edadCalculada.apply(objetoDatos, []);
Manipulación de Fechas
El objeto Date gestiona temporalidad. Se puede obtener la fecha actual o convertirla desde un timestamp numérico.
const instantePresente = new Date();
const milisegundos = instantePresente.getTime();
console.log(new Date(milisegundos));
Estandarización JSON
Para el intercambio de datos entre sistemas, se utiliza la sintaxis JSON. Los objetos se denotan con llaves {}, los arrays con corchetes [] y las parejas clave-valor se separan por dos puntos.
Solicitudes Asíncronas
Para enteractuar con servidores externos, existen varios enfoques implementables:
- API nativa XMLHttpRequest (XMLHttpRequest): Método base histórico.
- Librerías wrapper: Como Jquery que simplifican la sintaxis.
- Frameworks modernos: Soluciones como axios ofrecen interfaces más limpias.