Кудос до Брендона Мореллі. Він чудово пояснив тут , але посилання можуть загинути, тому я просто вставляю вміст нижче:
Синтаксис поширення - це просто три крапки: ...
він дозволяє ітерабельно розширюватися в місцях, де очікуються аргументи 0+. Визначення жорсткі без контексту. Давайте вивчимо кілька різних випадків використання, щоб допомогти зрозуміти, що це означає.
Приклад №1 - Вставлення масивів
Погляньте на код нижче. У цьому коді ми не використовуємо синтаксис розповсюдження:
var mid = [3, 4];
var arr = [1, 2, mid, 5, 6];
console.log(arr);
Вище ми створили масив з назвою mid
. Потім ми створюємо другий масив, який містить наш mid
масив. Нарешті ми виходимо з результату. Що ви очікуєте arr
надрукувати? Натисніть Виконати вище, щоб побачити, що відбувається Ось вихід:
[1, 2, [3, 4], 5, 6]
Це результат, який ви очікували? Вставивши mid
масив у arr
масив, ми закінчили масив у масиві. Це добре, якщо це була мета. Але що робити, якщо ви хочете лише один масив зі значеннями від 1 до 6? Для цього ми можемо використовувати синтаксис поширення! Пам’ятайте, синтаксис поширення дозволяє розширити елементи нашого масиву. Розглянемо код нижче. Все те саме - за винятком того, що ми зараз використовуємо синтаксис розширення для вставки mid
масиву в arr
масив:
var mid = [3, 4];
var arr = [1, 2, ...mid, 5, 6];
console.log(arr);
І коли ви натискаєте кнопку запуску, ось результат:
[1, 2, 3, 4, 5, 6]
Дивовижно! Пам'ятаєте визначення синтаксису поширення, яке ви тільки що прочитали вище? Ось де це вступає в гру. Як ви бачите, коли ми створюємо arr
масив і використовуємо оператор розповсюдження на mid
масиві, замість того, щоб просто вставляти, mid
масив розширюється. Це розширення означає, що кожен елемент у mid
масиві вставляється в arr
масив. Замість вкладених масивів результат - це єдиний масив чисел, що становить від 1 до 6.
Приклад №2 - У Math
JavaScript є вбудований математичний об'єкт, який дозволяє нам робити цікаві математичні обчислення. У цьому прикладі ми розглянемо Math.max()
. Якщо ви не знайомі, Math.max()
повертає найбільше з нуля або більше чисел. Ось кілька прикладів:
Math.max();
// -Infinity
Math.max(1, 2, 3);
// 3
Math.max(100, 3, 4);
// 100
Як бачите, якщо ви хочете знайти максимальне значення декількох чисел, Math.max()
потрібні кілька параметрів. Ви, на жаль, не можете просто використовувати один масив як вхід. Перед синтаксисом розповсюдження найпростіший спосіб використання Math.max()
в масиві - це використання.apply()
var arr = [2, 4, 8, 6, 0];
function max(arr) {
return Math.max.apply(null, arr);
}
console.log(max(arr));
Це працює, це просто дійсно дратує. Тепер погляньмо, як ми робимо те саме, що і з синтаксисом розповсюдження:
var arr = [2, 4, 8, 6, 0];
var max = Math.max(...arr);
console.log(max);
Замість того, щоб створювати функцію та використовувати метод нанесення, щоб повернути результат Math.max()
, нам потрібні лише два рядки коду! Синтаксис розповсюдження розширює наші елементи масиву та вводить кожен елемент нашого масиву окремо в Math.max()
метод!
Приклад №3 - Скопіюйте масив
В JavaScript ви не можете просто скопіювати масив, встановивши нову змінну, рівну вже існуючому масиву. Розглянемо наступний приклад коду:
var arr = ['a', 'b', 'c'];
var arr2 = arr;
console.log(arr2);
Після натискання клавіші Run ви отримаєте такий результат:
['a', 'b', 'c']
Тепер, на перший погляд, схоже, що це спрацювало - схоже, ми скопіювали значення arr в arr2. Але це не те, що сталося. Розумієте, під час роботи з об'єктами в javascript (масиви - це тип об'єкта), які ми призначаємо за посиланням, а не за значенням. Це означає, що arr2 був призначений для того ж посилання, що і arr. Іншими словами, все, що ми робимо для arr2, також вплине на вихідний масив arr (і навпаки). Подивіться нижче:
var arr = ['a', 'b', 'c'];
var arr2 = arr;
arr2.push('d');
console.log(arr);
Вище ми всунули новий елемент d у arr2. Однак, коли ми виходимо із значення arr, ви побачите, що значення d також було додане до цього масиву:
['a', 'b', 'c', 'd']
Не потрібно боятися, хоча! Ми можемо використовувати оператор розповсюдження! Розглянемо код нижче. Це майже те саме, що вище. Замість цього ми використовували оператор розповсюдження в межах квадратних дужок:
var arr = ['a', 'b', 'c'];
var arr2 = [...arr];
console.log(arr2);
Натисніть запустити, і ви побачите очікуваний вихід:
['a', 'b', 'c']
Вище значення масиву в arr розширювались і ставали окремими елементами, які потім були призначені arr2. Тепер ми можемо змінити масив arr2 скільки завгодно, без наслідків для початкового масиву arr:
var arr = ['a', 'b', 'c'];
var arr2 = [...arr];
arr2.push('d');
console.log(arr);
Знову ж таки, причина цього працює в тому, що значення arr розширено, щоб заповнити дужки нашого визначення масиву arr2. Таким чином, ми встановлюємо arr2 рівним індивідуальним значенням arr замість посилання на arr, як ми це робили в першому прикладі.
Приклад бонусу - String to Array
Як цікавий остаточний приклад, ви можете використовувати синтаксис спред для перетворення рядка в масив. Просто використовуйте синтаксис розповсюдження в парі квадратних дужок:
var str = "hello";
var chars = [...str];
console.log(chars);