В этой статье мы обсуждаем еще одну важную концепцию — разницу между остатком и оператором спреда. Категория этого вопроса - язык JavaScript.

И будет четыре относительных вопроса, которые мы обсуждаем с этой темой. Начиная с ES6, эти три точки используются во многих местах. Иногда их называют остаточными операторами, а иногда те же самые три точки называют операторами спреда. Почему так?

Давайте проверим это.

Начнем с оператора rest. Во-первых, представьте ситуацию, когда вам нужно создать функцию с именем sum, которая может принимать любое количество аргументов, а в конце она должна возвращать сумму всех переданных ей параметров.

Попробуем практически. Я создаю функцию. Сумма функций. Теперь я не хочу передавать два параметра, может быть, три параметра. Я просто хочу, чтобы я мог передавать любое количество параметров, которые должны быть получены этой функцией настолько, чтобы я мог использовать три точки, и это называется оператором покоя.

Так что я скажу остальные, например, цифры. Итак, это создаст массив чисел. Давайте для начала попробуем отобразить этот массив чисел.

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

Итак, вы видите, что у нас есть два массива, один из которых содержит два элемента, а другой содержит четыре числа, потому что мы использовали оператор rest.

Теперь, если мы хотим суммировать числа, мы можем поставить цикл, добавить числа и вернуться в конце. Так что это цель использования оператора rest.

Кроме того, в случае, если вы хотите, вот я иду, скажем так, на всякий случай, если эта функция имеет два параметра. Но первый параметр, я хочу иметь параметр остальных. Давайте попробуем это и посмотрим, что произойдет.

Как видите, выдает ошибку. Причина в том, что всякий раз, когда вы указываете оператор остальных параметров, он должен быть последним. На самом деле это фактически означает, что вы передали первый параметр a, а для остальных параметров у вас есть этот остаточный параметр. В этом значение имени, называемого остальными параметрами. Итак, теперь вы можете понять, почему мы используем три точки.

Помните, что оператор rest является частью ES6. в ES5 у нас есть похожий на массив объект с именем arguments, который не работает со стрелочной функцией. Так что избегаем.

Но давайте просто взглянем на объект arguments. Так же, допустим, у нас нет никаких параметров здесь и здесь напрямую. Я говорю аргументы. Я сохраняю это, очищая терминал. Теперь буду запускать ту же программу.

Когда я говорю, что arguments — это массивоподобный объект, это означает, что это не массив. С оператором rest мы создаем массив, тогда как здесь с объектом arguments у нас есть своего рода литерал объекта, который имеет ключ и значение. Ключ — это номер индекса, а затем значение.

Теперь, если я преобразую эту функцию в функцию стрелки, она перестанет работать. Давайте сделаем это. Я скажу, что const sum теперь равна стрелке, если я попытаюсь запустить ее. Тогда он выдаст мне ошибку. Короче говоря, объект arguments не работает со стрелочной функцией.

Таким образом, с функцией Arrow в любом случае у вас нет выбора, если вы хотите, чтобы любое количество параметров было передано в функцию, и вы хотите иметь дело с этим.

Все в порядке. Таким образом, всякий раз, когда вы используете три точки с функцией для работы с любым количеством параметров, вы называете ее оператором покоя. То есть по остальным параметрам.

Теперь поговорим об операторе спреда. Поскольку оператор rest помещает отдельные значения данных в один массив, спред делает прямо противоположное. Он распределяет массив по двум отдельным значениям данных.

Давайте попробуем еще один практический пример. Чтобы понять это, я создаю здесь один массив. Допустим, arr1 равно нескольким значениям. Скажем, раз, два, три, четыре и пять. Теперь предположим, что у вас есть другой массив. В этом массиве тоже есть свои элементы, скажем, из шести, семи и восьми, которые есть в этом массиве.

Теперь я хочу, чтобы все эти элементы в массиве 1 нам нужно было разместить здесь перед шестью, но эти добавленные элементы должны как бы распространять значения, а не весь массив.

Здесь у нас шесть, семь, восемь Ариетты. И когда вы говорите точка, точка, точка, это оператор распространения, array1, это означает, что массив arr1 теперь передается как отдельные элементы. Верно. Здесь не указана структура данных. Проходят простые отдельные элементы. Итак, один, два, три, четыре, пять — это как бы распространение в массиве. А потом шесть, семь, восемь.

Позвольте мне просто сохранить это, а также отобразить файл arr2. Видите ли, когда я показываю arr2, он отображает все элементы вместе.

Таким образом, мы теперь разделили эти значения arr1 и передали их в arr2.

Возьмем еще один пример по этому поводу. Предположим, что у вас есть этот arr1 с различными значениями, скажем, четыре семьдесят восемь, девяносто тридцать четыре и четыре, пять, девять.

Теперь я хочу найти максимальное значение среди всех этих элементов массива. Функция Math.max принимает значения отдельно. Так что в идеале вы должны написать 4,78,90 и так далее. Это означает, что вы собираетесь передавать отдельные значения данных. Верно.

Но здесь нам нужен этот массив значений, который у нас есть сейчас, мы хотим найти максимум из этого arr1, даже если я напишу arr1 напрямую. Давайте сделаем этот первый журнал консоли. И сохранить это.

Как вы видите, это дает NaN, Nan в основном не является числом. Так что это недопустимый способ передачи данных. Мы должны передать его отдельно, иначе у нас теперь есть оператор распространения, который позаботится о передаче отдельных значений. Итак, теперь, если я запущу это сейчас, у нас будет максимальное значение четыре пятьдесят девять.

Так вот как остальные операторы и операторы распространения, хотя они состоят только из трех точек, но в контексте, в котором они были использованы, они ведут себя.

Теперь давайте обсудим сопутствующие вопросы этой темы.

Первый вопрос: можем ли мы использовать объект arguments в функции стрелки?

Мы видели, что его нельзя использовать. Если это традиционный способ написания функции, она может работать, иначе не будет работать.

Второй вопрос: как лучше всего создавать новые массивы с назначениями?

Это оператор присваивания. Теперь, как вы будете присваивать, скажем, массив 1 равен массиву 2, если вы пишете, что это не очень предпочтительный способ, потому что и массив 1, и массив 2 будут объектами. Поэтому, когда вы назначаете, вы можете использовать оператор спреда. Таким образом, лучший способ присвоить массив — использовать оператор распространения.

Третий вопрос: как вы можете обрабатывать n параметров, переданных функции, или мы можем создать функцию, которая может принимать любое количество параметров и возвращать сумму или максимальное значение?

Вы можете использовать оператор rest для решения такой ситуации, что мы пробовали в одном из примеров ранее, хотя мы не пытались найти сумму, потому что это очень простая вещь, которую может сделать каждый, но идея состоит в том, чтобы иметь дело с остальным оператором.

Четвертый вопрос: можно ли разместить оператор rest в любом месте списка параметров функции?

Итак, как мы обсуждали ранее, мы не можем иметь остаточный параметр в начале списка параметров. Мы должны положить его наконец. Если у нас есть только параметр, все в порядке. Но если у нас больше параметров, то оставшийся параметр должен быть в последней позиции, потому что это остальные параметры.

Свод примеров