Propiedades de reposo y propagación de objetos
· 2 min de lectura
Antes de discutir propiedades de reposo y propagación de objetos, hagamos un viaje al pasado y recordemos una característica muy similar.
Elementos de reposo y propagación de arrays en ES2015
La buena vieja ECMAScript 2015 introdujo elementos de reposo para la asignación de desestructuración de arrays y elementos de propagación para literales de arrays.
// Elementos de reposo para la asignación de desestructuración de arrays:
const primes = [2, 3, 5, 7, 11];
const [first, second, ...rest] = primes;
console.log(first); // 2
console.log(second); // 3
console.log(rest); // [5, 7, 11]
// Elementos de propagación para literales de arrays:
const primesCopy = [first, second, ...rest];
console.log(primesCopy); // [2, 3, 5, 7, 11]
ES2018: propiedades de reposo y propagación de objetos 🆕
¿Qué hay de nuevo entonces? Bueno, una propuesta permite propiedades de reposo y propagación para literales de objetos también.
// Propiedades de reposo para la asignación de desestructuración de objetos:
const person = {
firstName: 'Sebastian',
lastName: 'Markbåge',
country: 'USA',
state: 'CA',
};
const { firstName, lastName, ...rest } = person;
console.log(firstName); // Sebastian
console.log(lastName); // Markbåge
console.log(rest); // { country: 'USA', state: 'CA' }
<!--truncate-->
// Propiedades de propagación para literales de objetos:
const personCopy = { firstName, lastName, ...rest };
console.log(personCopy);
// { firstName: 'Sebastian', lastName: 'Markbåge', country: 'USA', state: 'CA' }
Las propiedades de propagación ofrecen una alternativa más elegante a Object.assign()
en muchas situaciones:
// Clonar un objeto superficialmente:
const data = { x: 42, y: 27, label: 'Treasure' };
// La manera antigua:
const clone1 = Object.assign({}, data);
// La manera nueva:
const clone2 = { ...data };
// Ambos resultan en:
// { x: 42, y: 27, label: 'Treasure' }
// Fusionar dos objetos:
const defaultSettings = { logWarnings: false, logErrors: false };
const userSettings = { logErrors: true };
// La manera antigua:
const settings1 = Object.assign({}, defaultSettings, userSettings);
// La manera nueva:
const settings2 = { ...defaultSettings, ...userSettings };
// Ambos resultan en:
// { logWarnings: false, logErrors: true }
Sin embargo, hay algunas diferencias sutiles en cómo la propagación maneja los setters:
Object.assign()
activa setters; la propagación no lo hace.- Puedes evitar que
Object.assign()
cree propiedades propias mediante propiedades heredadas de solo lectura, pero no con el operador de propagación.
La redacción de Axel Rauschmayer explica estos inconvenientes con más detalle.