Принцип пайпа в JavaScript
пример кода
const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
принцип
Количество информации в строке кода очень велико, что можно проанализировать со следующих аспектов.
(...fns)
-
...оператор расширения массива в стандарте ES6 -
Оператор спреда расширяет массив:
Math.max(...[1,2,3])ЭквивалентноMath.max(1,2,3) -
В то же время он сочетается с назначением деструктурирования для создания массивов.пример кодаЭтот метод используется в конкретном примере:
[...fns] = [1,2,3]ноfns=[1,2,3]- Деструктурирующее присваивание: ES6 позволяет извлекать значения из массивов и объектов по определенному шаблону, а затем присваивать значения переменным, что называется деструктурированием; пример:
let [a,b,c] = [1,2,3]
- Деструктурирующее присваивание: ES6 позволяет извлекать значения из массивов и объектов по определенному шаблону, а затем присваивать значения переменным, что называется деструктурированием; пример:
=>
- Это стрелочная функция, левая сторона — параметр функции, правая — тело функции.
- Стрелочные функции имеют свои особенности, например, это указывает на
- это указывает на объект, где он был определен, а не на объект, где он использовался
- нельзя использовать как конструктор
- Вы не можете использовать объект arguments, вместо этого вы можете использовать параметр rest
- Остальной параметр представляет собой некое имя, которое относится к методу передачи параметра функции записи (...имя_переменной).
- Команда yield не может быть использована
- Стрелочные функции не имеют свойства прототипа
- нельзя использовать с новыми
reduce
- Эта функция работает с объектами массива
- Получает функцию как аккумулятор, и каждое значение в массиве (слева направо) сводится к значению
- Прототип функции: Array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
- Мы можем определить функцию function(total, currentValue, currentIndex, arr) как часть персонализированной логической обработки и вручную указать начальное значение initialValue.
- Роль начального значенияКогда пользовательская функция выполняется в первый раз, значение параметра total равно установленному нами начальному значению, initialValue
- currentValue — значение текущего массива, то есть currentValue === arr[currentIndex]
Функция Coreyization
-
Каррированная функция — это функция, которая преобразуется из функции, принимающей несколько параметров, в функцию, которая принимает только один параметр за раз: если функция принимает 3 параметра, каррированная функция примет один параметр и вернет функцию для принятия. функция, эта функция возвращает функцию для передачи в третьем параметре, а последняя функция применит результат функции всех параметров.
-
поставить вышепример кодаПреобразуйте его в форму:
const pipe = function(x, ...fns) { fns.reduce((y, f) => f(y), x); }
Дальнейший демонтаж
-
Для того, чтобы увидеть реальную роль функции конвейера, вышеперечисленные функции дополнительно разобраны и выражены в простейшем синтаксисе, чтобы более четко проследить их внутренние принципы.
function pipe(x, ...fns){ let total = x; for(let f in fns){ total = f(total) } return total; }
Пример
-
когда мы звоним
pipe(x, f1, f2), возвращает f2(f1(x)) -
пример кода
const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x); const f1 = x => { return x+1; } const f2 = x => { return 2 * x; } // (1+1)*2 = 4 let result = pipe(f1, f2)(1); console.log(result);