Когда я думаю об удивительных возможностях EcmaScript6, одна из первых супер крутых вещей, которая приходит мне в голову, - это «Синтаксис распространения» или «Оператор распространения». Эта функция - один из самых полезных приемов для управления деструктуризацией большого количества данных и объектов. Поэтому я покажу вам все варианты использования, которые обнаружил во время работы.
1. Слияние массивов
Когда вам нужно безопасно объединить два массива (подробнее о слиянии массивов здесь):
const arr1 = [1, 2]; const arr2 = [3, 4]; const arr1Plusarr2 = [...arr1, ...arr2]; const newArrayMerged = [0, ...arr1, ...arr2]; console.log(arr1Plusarr2); // [1, 2, 3, 4] console.log(newArrayMerged); // [0, 1, 2, 3, 4]
2. Объединение объектов
Когда вам нужно объединить свойства двух разных объектов:
const object1 = { b: 2 }; const object2 = { c: 3 }; const object1PlusObject2 = { ...object1, ...object2 }; const newObjectMerged = { a: 1, ...object1, ...object2 }; console.log(object1PlusObject2); // { b: 2, c: 3 } console.log(newObjectMerged); // { a: 1, b: 2, c: 3 }
3. Разрушение массива
Когда вам нужно сохранить все значения индекса без присваивания при деструктуризации массивов, сколько бы их ни было:
const bigArray = [0, 1, 2, 3, 4]; const [index0, index1, ...rest] = bigArray; console.log(index0); // 0 console.log(index1); // 1 console.log(rest); // [2, 3, 4]
4. Разрушение объекта.
Когда вам нужно создать новый объект со всеми не извлеченными значениями, если объект деструктурирует, не важно, сколько их:
const mainObject = { a: 1, b: 2, c: 3, d: 4, e: 5 }; const { a, b, ...rest } = mainObject; console.log(a); // 1 console.log(a); // 2 console.log(rest); // { c: 3, d: 4, e: 5 }
5. Функциональные параметры
Когда вам нужно передать функции много параметров, независимо от их количества. Параметры поступили в виде массива:
const addAll = (...params) => params.reduce( (acc, current) => acc + current, 0 ); addAll(1, 2, 3); // 6 addAll(1, 2, 3, 1, 1, 1, 1); // 10 addAll(3, 5); // 8
При этом вы можете получать одни значения отдельно, а все остальные, используя синтаксис распространения:
const subwaySandwich = (bread, size, ...ingredients) => { console.log(bread); // Italian console.log(size); // 15cm console.log(ingredients); // ['mustard', 'mayo'] } subwaySandwich( 'Italian', '15cm', 'mustard', 'mayo' );
И да ... Вы можете передать объект, отправить отдельные значения по ключу и сгруппировать все остальные в личный ключ:
const person = ({ age, gender, ...rest }) => { console.log(age); // 15 console.log(gender); // female console.log(rest); // { hair: 'brun', eyes: 'blue' } } person({ age: 15, gender: 'female', hair: 'brun', eyes: 'blue', })
6. С условиями
Да! Вы также можете использовать оператор распространения для управления объектом (или массивом) условно: вам просто нужно заключить его в круглые скобки и создать условие.
const carBase = { wheels: 4, doors: 4 }; const isVehicle = true; const renault = { ...(isVehicle && carBase), country: 'France', } console.log(renault) // { wheels: 4, doors: 4, country: 'France' }
Итак, как вы можете видеть, оператор распространения - это современный синтаксис для манипулирования объектами и структурами данных, предлагающий вам возможность делать больше с меньшими затратами.