Один из синтаксических сахаров ES6 «…» три точки

Все мы знаем об обновлении ES6 для JavaScript, и оно принесло с собой отличный синтаксический сахар в виде обновления, улучшающего и упрощающего написание кода или помогающего нам создавать более гибкие функции. Один из них - это запись с тремя точками «…», которую мы можем использовать двумя разными способами: один - как параметр отдыха, а другой - как оператор распространения. Итак, что это такое и чем они отличаются при использовании одинаковых обозначений для двух разных слов?

Остаточный параметр

Остальной синтаксис собирает множество элементов и превращает их в один элемент. Давайте возьмем пример, мы выполняем такую ​​функцию (как показано ниже)

function add(a, b) {
  return a + b;
}
console.log(add(1, 2, 3, 4, 5)); //returns 3

Вышеупомянутая функция вернет «3» в качестве вывода в журнале, потому что в JavaScript мы можем передать любое количество входных данных или аргументов, как мы передали в «add (1, 2, 3,4,5)». В данном случае рассматриваются только первые два. И чтобы преодолеть это, мы используем параметр rest. С помощью параметра rest мы можем собрать любое количество аргументов или входных данных и выполнить с ними любую операцию, которую захотим. Пример ниже

function add(...args) {
  let sum = 0;
  for(var i = 0; i< args.length; i++){
     sum=sum+args[i];
  }
  return sum;
}
console.log(add(1));        //returns 1
console.log(add(1,2));      //returns 3 
console.log(add(1,2,3));    //returns 6

Примечание. В определении функции может быть только один параметр rest «…», а параметр rest должен находиться в последнем аргументе. Это потому, что он собирает все оставшиеся / лишние аргументы в массив.

xyz(...arg1, arg2, arg3)       // Wrong Way 
xyz(arg1, ...arg2, arg3)       // Wrong Way
xyz(...arg1, ...arg2, arg3)    // Wrong Way
xyz(arg1, ...arg2, ...arg3)    //Wrong Way
xyz(...arg1, ...arg2, ...arg3) //Wrong Way

Выше приведены почти все неправильные способы объявления остальных параметров. Ниже приведены правильные способы

xyz(...arg1)              // Right Way
xyz(arg1, ...arg2)        // Right Way
xyz(arg1, arg2, ...arg3)  // Right Way

Оператор распространения

Синтаксис Spread «расширяет» массив на его элементы, в то время как синтаксис rest собирает несколько элементов и «уплотняет» их в один элемент.

Согласно MDN Web Docs определение оператора распространения выглядит примерно так:
Синтаксис распространения (…) позволяет расширять итерируемый объект, такой как выражение массива или строка, в местах, где ноль или более аргументов (для вызовов функций ) или элементы (для литералов массива), либо выражение объекта будет развернуто в местах, где ожидается ноль или более пар ключ-значение (для литералов объекта).

Давайте посмотрим, как и где используется оператор спреда:

Добавление элементов массива в существующий массив

var arr = ["A", "B", "C"];
var newArr = ["D", ...arr];
console.log(newArr); //output will be ["D", "A", "B", "C"]

Значение newArr будет ["D", "A", "B", "C"]. В отличие от остальных параметров, мы можем использовать оператор распространения в качестве первого аргумента.

var newArr = [...arr, "D"];
console.log(newArr); //output will be ["A", "B", "C", "D"]

Итак, если мы наконец хотим добавить элементы, вы можете увидеть, что мы можем сделать это в операторе распространения. Результатом в приведенном выше случае будет ["A", "B", "C", "D"].

Копирование массива

Мы можем использовать оператор распространения, чтобы скопировать массив.

var arr1 = [1, 2, 3, 4, 5];
var arr2 = [...arr];

Таким образом arr1 можно легко скопировать в arr2.

Передача элементов массива в качестве отдельных аргументов функции

Если у нас есть массив, и мы должны передать весь массив функции, мы можем сделать это следующим образом

function sum(x, y, z) {
  return x + y + z;
}
const numbers = [1, 2, 3];
console.log(sum(...numbers));  // expected output: 6

Здесь sum вызов функции аналогичен sum(1, 2, 3). Примечание. Iterable также работает в операторе распространения. Итак, если бы у нас была строка, как показано ниже

const str = "Hello!";
console.log([...str]); 
//expected output ["H", "e", "l", "l", "o", "!"]

Мы видим, что результат именно в этом случае.

Думаю, эта статья могла бы прояснить концепцию. Для более упрощенного объяснения вы можете посетить эту иллюстрацию Стефани. Отличное объяснение с ее стороны, и если вам нравится ее работа, следуйте за ней.

Если вам понравилась эта статья, подпишитесь на меня в Twitter или LinkedIn.