ECMAScript 6, también conocido como ECMAScript 2015, fue una actualización importante del lenguaje JavaScript y trajo muchas funciones y mejoras nuevas. Estas diez características son algunas de las adiciones más utilizadas e importantes al lenguaje.
1. Let y Const: La introducción de variables de ámbito de bloque.
En JavaScript, una variable let
es una variable de ámbito de bloque declarada con la palabra clave let
.
La principal diferencia entre var y let es el ámbito en el que se declaran. Las variables declaradas con var
tienen un ámbito de función, lo que significa que son accesibles dentro de toda la función en la que se declaran. Por otro lado, las variables declaradas con let
tienen alcance de bloque, lo que significa que solo son accesibles dentro del bloque en el que se declaran.
He aquí un ejemplo para demostrar la diferencia:
function example() {
if (true) {
let x = 10;
var y = 20;
}
console.log(x); // ReferenceError: x is not defined
console.log(y); // Output: 20
}
example();
En este ejemplo, la variable let
x
solo es accesible dentro del bloque en el que se declara (la declaración if
), mientras que la variable var
y
es accesible a lo largo de toda la función. Intentar acceder a x
fuera de su bloque dar como resultado un error de referencia ReferenceError
.
2. Funciones de flechas: sintaxis abreviada para crear funciones.
Las funciones de flecha, también conocidas como fat arrow functions
, son una sintaxis abreviada para definir funciones en JavaScript.
Las funciones de flecha tienen la siguiente sintaxis:
// Basic arrow function with one argument and one statement
const square = (x) => x * x;
console.log(square(3)); // Output: 9
// Arrow function with multiple arguments and multiple statements
const multiply = (x, y) => {
const result = x * y;
return result;
};
console.log(multiply(3, 4)); // Output: 12
Las funciones de flecha tienen una serie de beneficios, que incluyen:
Sintaxis más corta: las funciones de flecha son más cortas y fáciles de leer en comparación con las expresiones de funciones tradicionales.
Retorno implícito: si una función de flecha tiene una sola expresión, el valor de retorno se devuelve implícitamente. No es necesario incluir la palabra clave de retorno.
Lexical
this
: las funciones de flecha heredan el valor dethis
del contexto que las rodea, lo que las hace ideales para usar en devoluciones de llamada y controladores de eventos.No se pueden usar como constructores: las funciones de flecha no se pueden usar con el operador
new
para crear objetos, lo que ayuda a evitar algunos errores comunes.
En general, las funciones de flecha son una característica poderosa y conveniente de JavaScript y se usan ampliamente en el código moderno.
3. Template literals: interpolación de cadenas y cadenas multilínea.
Brindan una forma más conveniente de crear cadenas que incluyen contenido dinámico.
Los literales de plantilla usan acentos graves () en lugar de comillas simples o dobles para definir literales de cadena. Las expresiones se pueden incluir dentro de un literal de plantilla utilizando la sintaxis ${expresion}.
Aquí hay un ejemplo del uso de literales de plantilla:
const name = 'John';
const message = `Hello, ${name}!`;
console.log(message); // Output: Hello, John!
También admiten cadenas de varias líneas, lo que puede ser til para crear cadenas más complejas:
const multiLine = `This is a
multiline string.`;
console.log(multiLine);
Salida:
This is a
multiline string.
4. Desestructuración: extracción de valores de matrices u objetos.
La desestructuración en JavaScript es una función que le permite extraer valores de matrices u objetos y asignarlos a variables. Esto proporciona una forma conveniente y eficiente de desempaquetar valores de matrices y objetos, lo que facilita el trabajo con datos de manera estructurada.
Aquí hay un ejemplo de desestructuración de una matriz:
const numbers = [1, 2, 3];
const [first, second, third] = numbers;
console.log(first, second, third); // Output: 1 2 3
Aquí hay un ejemplo de desestructuración de un objeto:
const person = { name: 'John', age: 30 };
const { name, age } = person;
console.log(name, age); // Output: John 30
La desestructuración también se puede utilizar para extraer valores de matrices y objetos anidados:
const data = {
person: { name: 'John', age: 30 },
numbers: [1, 2, 3]
};
const { person: { name }, numbers: [first, second, third] } = data;
console.log(name, first, second, third); // Output: John 1 2 3
5. Parámetros predeterminados: especificación de valores predeterminados para los parámetros de función.
Los parámetros predeterminados son una característica de JavaScript que le permite especificar valores predeterminados para los parámetros de la función. Si se llama a una función sin un argumento para un parámetro dado, se usar el valor predeterminado en su lugar. Esto puede ser til para proporcionar un comportamiento predeterminado para parámetros opcionales y evitar errores causados por argumentos faltantes.
Este es un ejemplo del uso de parámetro predeterminados:
function greet(name = 'Guest') {
console.log(`Hello, ${name}!`);
}
greet(); // Output: Hello, Guest!
greet('John'); // Output: Hello, John!
En el ejemplo anterior, si se llama a saludar
sin un argumento, se usar el valor predeterminado 'Invitado' para el parámetro de nombre. Si se proporciona un argumento, se utilizar en lugar del valor predeterminado.
Los parámetros predeterminados se pueden usar con cualquier tipo de valor, incluidos números, cadenas, matrices y objetos. También pueden ser expresiones o el resultado de una llamada de función.
function calculateSum(a = 1, b = 2) {
return a + b;
}
console.log(calculateSum()); // Output: 3
console.log(calculateSum(3, 4)); // Output: 7
Los parámetros predeterminados son una característica til en JavaScript, que le permite proporcionar un comportamiento predeterminado para parámetros opcionales y evitar errores causados por argumentos faltantes.
6. Operadores Rest y Spread: Combinando arrays o separándolos.
El operador rest
y el operador de spread
son dos funciones que se usan para manejar argumentos de una función y manipulación de matrices/objetos.
El operador rest (...)
le permite representar un número indefinido de argumentos como una matriz. Se usa en declaraciones de funciones para capturar todos los argumentos pasados a la función, excluyendo los parámetros con nombre.
Aquí hay un ejemplo del uso del operador rest
:
function sum(...numbers) {
return numbers.reduce((total, value) => total + value, 0);
}
console.log(sum(1, 2, 3, 4)); // Output: 10
En el ejemplo anterior, el operador rest ...numbers
recopila todos los argumentos pasados a la función de suma y los asigna a una matriz de números.
El operador de propagación (...)
le permite distribuir los elementos de una matriz o un objeto en una nueva matriz u objeto. También se puede usar para concatenar arreglos o pasar elementos individuales de un arreglo como argumentos separados a una función.
Aquí hay un ejemplo del uso del operador de propagación para concatenar matrices:
const array1 = [1, 2, 3];
const array2 = [4, 5, 6];
const concatenated = [...array1, ...array2];
console.log(concatenated); // Output: [1, 2, 3, 4, 5, 6]
En el ejemplo anterior, el operador de propagación ...array1
y ...array2
distribuyen los elementos de array1
y array2
en una nueva matriz concatenada.
Los operadores rest y spread brindan una manera conveniente y concisa de manejar argumentos de funciones y manipulación de matrices/objetos en JavaScript, y se usan ampliamente en el código moderno.
7. Clases: un azúcar sintáctico para la programación orientada a objetos.
Las clases le permiten definir la estructura de un objeto, incluidas sus propiedades y métodos, y crear varias instancias del mismo objeto con un comportamiento similar.
Aquí hay un ejemplo del uso de una clase en JavaScript:
class User {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(`Hello, my name is ${this.name}`);
}
}
const john = new User('John');
john.sayHello(); // Output: Hello, my name is John
const jane = new User('Jane');
jane.sayHello(); // Output: Hello, my name is Jane
En el ejemplo anterior, definimos una clase User
con un método constructor
que establece la propiedad de name
de una instancia y un método sayHello
que genera un mensaje de saludo. Luego creamos dos instancias de la clase User
, john y jane , y llamamos a sus respectivos métodos sayHello
.
Las clases en JavaScript también admiten la herencia, lo que le permite crear una nueva clase basada en una clase existente, con la capacidad de sobreescribir o ampliar sus propiedades y métodos.
class Admin extends User {
constructor(name, role) {
super(name);
this.role = role;
}
sayHello() {
console.log(`Hello, my name is ${this.name} and I am an ${this.role}`);
}
}
const admin = new Admin('Admin', 'administrator');
admin.sayHello(); // Output: Hello, my name is Admin and I am an administrator
En el ejemplo anterior, definimos una clase Admin
que amplía la clase User
y agrega una propiedad de rol
y una nueva implementación del método sayHello
. Luego creamos una instancia de la clase Admin
, admin , y llamamos a su método sayHello
.
Las clases son una función poderosa y flexible en JavaScript, que le permite definir la estructura y el comportamiento de los objetos y admitir la herencia y los patrones de programación orientados a objetos.
8. Módulos: forma estándar de organizar el código en unidades reutilizables.
Los módulos en JavaScript son una forma de organizar y reutilizar el código encapsulándolo en unidades reutilizables que se pueden importar y usar en otras partes de una aplicación. Un módulo puede contener variables, funciones, clases y otro código, y puede exponer una interfaz al resto de la aplicación que especifica qué partes del módulo son públicas y accesibles para otro código.
Hay dos formas principales de usar módulos en JavaScript:
Módulos CommonJS (utilizados en Node.js): un módulo en CommonJS se define como un archivo único que exporta uno o más valores y se puede importar a otros archivos en la aplicación. Las exportaciones son accesibles a otros archivos usando la función require. Aquí hay un ejemplo del uso de módulos CommonJS en Node.js:
Módulos ES6 (compatibles con navegadores modernos y con herramientas como Babel): un módulo en ES6 se define como un archivo único que exporta uno o más valores y se puede importar a otros archivos en la aplicación. Las exportaciones son accesibles a otros archivos utilizando las declaraciones de
import
yexport
.
9. Map and Set: Estructuras de datos mejoradas para almacenar colecciones.
Map: Es una colección de pares clave-valor. Las claves pueden tener cualquier valor (objetos, primitivas) y no tienen que ser únicas. Los valores en un Map se pueden acceder, agregar o modificar usando las claves.
let myMap = new Map();
// Añadiendo pares de clave-valor al mapa
myMap.set('name', 'John');
myMap.set('age', 30);
myMap.set('city', 'New York');
// Obteniendo los valores del mapa
console.log(myMap.get('name')); // Output: John
console.log(myMap.get('age')); // Output: 30
// Revisando el tamaño del map
console.log(myMap.size); // Output: 3
// Revisar si existe una clave dentro del mapa
console.log(myMap.has('name')); // Output: true
// Eliminando una clave-valor del mapa
myMap.delete('city');
console.log(myMap.has('city')); // Output: false
Set: Es una colección de valores únicos. Los valores pueden ser de cualquier tipo y no tienen que ser del mismo tipo. Le permite almacenar valores únicos en una colección desordenada y proporciona métodos para manipular los valores.
let mySet = new Set();
// Añadiendo valores al Set
mySet.add(1);
mySet.add(2);
mySet.add(3);
mySet.add(2); // Este valor no se aade debido a que Set no soporta duplicados
// Revisando el tamaño del Set
console.log(mySet.size); // Output: 3
// Revisando si un valor esta presente en el Set
console.log(mySet.has(2)); // Output: true
// Removiendo un valor del Set
mySet.delete(1);
console.log(mySet.has(1)); // Output: false
// Iterando sobre los valores del Set
for (let value of mySet) {
console.log(value);
}
// Output:
// 2
// 3
10. Promesas: una mejor manera de manejar el código asíncrono.
Las promesas son objetos en JavaScript que representan la eventual finalización o falla de una operación asincrónica. Proporcionan una manera de manejar los resultados de las operaciones asincrónicas (como las solicitudes de red) de una manera más fácil de leer y mantener.
Una Promesa puede estar en uno de tres estados:
Pendiente (Pending): estado inicial, ni cumplida ni rechazada.
Cumplido (Fulfilled): lo que significa que la operación se completó con éxito.
Rechazado (Rejected): significa que la operación fall.
Puede adjuntar funciones de devolución de llamada a una Promesa usando el método then
para manejar el cumplimiento y el método catch
para manejar el rechazo.
Aquí hay un ejemplo del uso de una Promesa en JavaScript:
let myPromise = new Promise((resolve, reject) => {
let result = doSomethingAsynchronously();
if (result) {
resolve(result);
} else {
reject(Error('Operation failed'));
}
});
myPromise
.then(result => {
// handle success
})
.catch(error => {
// handle error
});
Top comments (0)