Spread оператор в JS
Оператор spread (...) в JavaScript - это мощная функция, используемая для расширения или разбиения элементов итерируемого объекта (например, массива или объекта object) на отдельные элементы. Он обычно используется в ситуациях, когда требуется скопировать или объединить массивы, объекты или даже передать аргументы функциям.
1. Массивы с оператором распространения
Когда вы используете оператор spread с массивами, JavaScript, по сути, копирует элементы из массива в новый массив или расширяет элементы с помощью вызова функции.
let arr = [1, 2, 3];
let newArr = [...arr];
console.log(newArr);
Вывод:
[ 1, 2, 3 ]
За кулисами:
- Оператор spread берет массив arr и разбивает его на отдельные значения, фактически создавая неполную копию массива.
- Оператор вызывает внутренний протокол iterable для выполнения итерации по массиву и добавления каждого элемента в новый массив. По сути, он имитирует поведение метода Array.prototype.push(), но для всех элементов.
С технической точки зрения, оператор spread эквивалентен использованию метода Array.prototype.concat() или Array.prototype.push():
let newArr = [].concat(arr); // Equivalent to [...arr]
2. Объекты с оператором распространения
Для объектов оператор spread создает неполную копию, копируя все перечислимые свойства из исходного объекта в новый объект.
let person = { name: 'GFG', age: 25 };
let newPerson = { ...person };
console.log(newPerson);
Вывод:
{ name: 'GFG', age: 25 }
За кулисами:
- Оператор spread перебирает все свойства объекта person и добавляет их к новому объекту. Он работает путем доступа к ключам и значениям объекта и их копирования.
- Эта операция является поверхностным копированием, поэтому, если значения свойств объекта сами по себе являются объектами (вложенными объектами), копируются только ссылки на них, а не сами объекты.
Внутренне это эквивалентно:
let newPerson = Object.assign({}, person);
3. При вызове функций
Оператор spread также может использоваться для передачи массива или iterable в качестве отдельных аргументов функции. Это полезно, когда у вас есть массив значений, но вам нужно вызвать функцию с этими значениями в качестве отдельных аргументов.
function sum(a, b, c) {
return a + b + c;
}
let nums = [1, 2, 3];
console.log(sum(...nums));
let nums = [1, 2, 3];
console.log(sum(...nums));
Вывод:
6
За кулисами:
- Оператор spread распаковывает массив nums и вызывает функцию sum, используя в качестве аргументов каждый отдельный элемент массива. Это выглядит так, как если бы функция вызывалась следующим образом:
sum(1, 2, 3);
Внутренне JavaScript использует метод apply() или аналогичный внутренний механизм для распространения аргументов:
sum.apply(null, nums); // Equivalent to sum(...nums)
4. Объединение массивов и объектов
Оператор spread можно легко использовать для объединения массивов и объектов.
Массивы:
let arr1 = [1, 2];
let arr2 = [3, 4];
let combined = [...arr1, ...arr2];
console.log(combined);
Вывод:
[ 1, 2, 3, 4 ]
За кулисами:
- Внутренне JavaScript выполняет несколько операций concat() или использует push() для добавления элементов arr2 в arr1.
Объект:
let obj1 = { name: 'GFG' };
let obj2 = { age: 25 };
let combinedObj = { ...obj1, ...obj2 };
console.log(combinedObj);
Вывод:
{ name: 'GFG', age: 25 }
За кулисами:
- Оператор spread копирует все свойства из obj1 и obj2 в новый объект.Если ключи перекрываются, более поздний объект перезапишет предыдущий.