JavaScript语法进阶 — 函数化编程
2018-12-12 本文已影响18人
Vampire_时代
函数化编程.jpg
前言
记得之前面试iOS的时候被问到Swift语言特性有哪些,回答的其中一条包括函数化编程,但是怎么函数化的却一时没怎么答好(的确是运用的太少,只处于理论阶段)。如今在数据处理模块中充斥着map,filter,Object.assign等等将计算过程分解成可复用的函数。
以及代码皆为JavaScript
演示
什么是面向对象编程
个人理解的可能是复杂的代码简单化?计算方法的抽象?函数的合并?但可能没理解到 函数就是相当于太极,无级就图灵机,Lambda,太极就是函数。
为什么要运用函数化编程这种编程范式
有多少大侠或多或少写过类似这样的代码
const a = [1,2,3,4,5,6];
const b = [5,6,7];
for(let i = 0; i < b.length; i++) {
a.push(b[i]);
}
const c = [1,2,3,4,5,6];
const d = [];
for(let i = 0; i < c.length; i++) {
if (c[i] > 4) {
d.push(c[i]);
}
}
其实拼接两个数组只需要这样a.concat(b)
,筛选只需要d.filter((item)=> item > 4)
,这就是高阶函数代来的便捷,还有类似的:
// 获取字典的key
const anObj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.keys(anObj)); // console: ['2', '7', '100']
// 同理
const anObj2 = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(anObj2)); // console: ['a', 'b', 'c']
函子
函数不仅可以用于同一个范畴之中值的转换,还可以用于将一个范畴转成另一个范畴。这就涉及到了函子(Functor)。
不才,恐怕解释不好,还是参考阮老师的函数式编程入门教程.
柯里化函数
// 柯里化之前
function add(x, y) {
return x + y;
}
add(1, 2) // 3
// 柯里化之后
function addX(y) {
return function (x) {
return x + y;
};
}
addX(2)(1) // 3
虽然在Swift中接触到这个概念,但是运用还不是太熟练~待补充(更方便的处理参数?在复杂的方法中抽出函数?增加阅读性?
结尾
当然我们无形中也封装过这些函数,将一个值经过多次处理变成另外一个值,例如将时间戳转化为标准时间,其实就是把中间步骤合并成一个函数。当然它最好是没有副作用的函数~