Функциональное программирование – это действительно полезный инструмент в вашем наборе инструментов. Для меня это изменило то, как я разрабатываю решения для множества различных проблем.
Что такое функциональное программирование?
Функциональное программирование – это парадигма программирования, где все является функцией, и цель состоит в том, чтобы все было простым и математическим. Переменные предназначены для поддержания, по крайней мере, на уровне функции, и ожидается, что они будут делать то, что они говорят без каких-либо побочных эффектов. Функция 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”