Рубрики
Без рубрики

Функциональное программирование в JavaScript

Взгляните на некоторые из аккуратных вещей, которые вы можете сделать, когда можете назначить функции переменным. Tagged с JavaScript, функциональный.

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

Что такое функциональное программирование?

Функциональное программирование – это парадигма программирования, где все является функцией, и цель состоит в том, чтобы все было простым и математическим. Переменные предназначены для поддержания, по крайней мере, на уровне функции, и ожидается, что они будут делать то, что они говорят без каких-либо побочных эффектов. Функция printObject Не должно также добавлять поле к объекту, который он берет.

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

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

Функциональное программирование в JavaScript

JavaScript очень функционирует. Присвоение функций переменным – важный способ их создания!

const printHello = function() {
    console.log("Hello!");
}

printHello();

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

function add(firstNumber, secondNumber) {
    return firstNumber + secondNumber;
}

console.log(add(2, 4)); // Prints "6"

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

const yellToConsole = (message) => {
    console.log(message.toUpperCase());
}

yellToConsole("Hello!"); // Prints "HELLO!"

Есть некоторые нюансы между стрелками и нормальными функциями в JavaScript, которые появляются в заголовке Страница MDN для функций стрелки Анкет

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

Стандартная библиотека

Два из основных мест, которые я вижу в функциональном программировании в стандартной библиотеке JavaScript,-это функции массива и обратные вызовы, особенно когда они расширяются, чтобы включить много обычно используемых библиотек, таких как Лодаш Анкет

Каждый массив поставляется с некоторыми дополнительными функциями, прикрепленными.

карта

Функция карты принимает функцию как аргумент, и превращает массив в нечто другое.

const numberList = [1, 2, 3, 4];

const stringList = numberList.map((number) => number.toString()); // ["1", "2", "3", "4"]

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

const numberList = [1, 2, 3, 4];

function square(number) {
    return number * number;
}

const squareList = numberList.map(square); // [1, 4, 9, 16]

Уменьшать

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

const numberList = [1, 2, 3, 4];

const sum = numberList.reduce((currentSum, number) => currentSum + number, 0); // 10

Обратите внимание, как мы получаем тока параметр для функции? Это называется Аккумулятор и представляет все, что было объединено до сих пор. У нас также есть 0 В конце вызова функции, который сообщает JavaScript, с чего должен начаться этот аккумулятор. Это может быть пустая строка, если мы строили строку на основе элементов в списке.

Фильтр

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

const numberList = [1, 2, 3, 4];

const evens = numberList.filter((number) => number % 2 === 0); // [2, 4]

Фильтр также можно использовать для удаления элементов из списка, который мы не можем изменить. Как вы думаете, как мы это сделаем?

Немного

Некоторые из них являются комбинацией фильтр и уменьшить Анкет Он используется для определения того, соответствует ли какое -либо из значений в списке.

const numberList = [1, 2, 3, 4];

const isOneInList = numberList.some((number) => number === 1); // true

Обратный вызов

Обратные вызовы используются для выполнения обработки, когда что -то заканчивается. Они могут быть прикованы вместе, чтобы обеспечить сложную обработку, но могут запутаться, когда они вкладываются во многие слои. Эта путаница является частью того, что мотивация для Асинхронизация / ждет был. Функции внутри Тогда Блоки – обратные вызовы в Обещания .

fetch('https://api.github.com/gists/e59384900942ee13af189bf92c7adfef')
    .then(response => response.json())
    .then(json => console.log(json.description)); // Prints "Predication in C# collections."

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

Делать это самостоятельно – написание простой функции

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

/**
 * @callback anyMatch~predicate
 *
 * A predicate that applies to any item.
 *
 * @param {any} item The item to check this condition on.
 * @returns {boolean} Whether this condition passed or not.
 */

/**
 * Imitation of the array 'some' function.
 * 
 * @param {any[]} list The list to process.
 * @param {anyMatch~predicate} predicate The predicate to apply to each item.
 * @returns {boolean} Whether any item in this list matched this condition.
 */
const anyMatch = function(list, predicate) {

};

Далее мы можем пройти через, проверяя каждый элемент на предикате:

const anyMatch = function(list, predicate) {
    for(const item of list) {
        if(predicate(item)) { // The item matched the predicate.
            return true;
        }
    }
    return false; // Nothing matched the predicate.
};

Обратите внимание, как мы можем позвонить предикат Как если бы это была другая функция? Это все, что нужно. Теперь давайте проведем некоторые тесты:

console.log(anyMatch([1, 2, 3, 4], (item) => item === 1)); // Prints "true"
console.log(anyMatch([1, 2, 3, 4], (item) => item === 5)); // Prints "false"

И это работает! Я надеюсь, что это было по крайней мере немного поучительно. Какие общие сценарии вы видите подходам к тому, для этого работают? Дай мне знать в комментариях.

Оригинал: “https://dev.to/hunter/functional-programming-in-javascript-3j0p”