函数式

1.基础概念

函数式:使用函数来抽象对数据的处理。函数式致力于产生小的副作用,简化代码体量。表现上看,函数式是分解流程+组合流程。分解步骤表达了单一职责这一目的。组合可以让数据操作更趋向于自然语言的表达。

2.示例

1.计算平均值,使用数学进行描述的话,那么就是分为求和,求长度,除法。因此使用函数实现这几个步骤:

1
2
3
4
5
6
const plus = (total, cur) => total + cur;
const sum = arr => arr.reduce(plus); // 模拟求和
const length = arr => arr.length; // 模拟求长度
const divider = (a, b) => a / b; // 模拟除法
const average = arr => divider(sum(arr), length(arr));
average([1,2,3]);

函数式追求纯数据,别跟函数式谈对象,在它的范畴里,说成数值更加的合适,如果是数值的话,那么可以不用担心被纂改。那么问题来了,对于JavaScript来说,怎么实现纯对象呢?也别提const,const只是保证引用链是不可被修改的。

一般的做法是是使用Object.freeze方法来模拟不可变,但是需要记住的是Object.freeze是浅冻结,何谓浅冻结?如下所示:

1
2
3
4
5
6
let obj = { a: 1, k: { b: 2 } };
Object.freeze(obj);
obj.k = { b: 3 };
obj.k; // { b: 2 }
obj.k.b = 3;
obj.k; // { b: 3 }

因此,在js中,为了尽可能的实现纯的话,很可能你需要自己实现一个深冻结的方法。一层一层遍历下去,接着进行冻结。如下所示:

1
2
3
4
5
6
7
8
9
const isObject = obj => obj && typeof obj === "object";

const deepFreeze = obj => {
if (isObject(obj) && Object.isFrozen(obj)) {
Object.freeze(obj);
Object.keys(obj).forEach(name => deepFreeze(obj[name]));
}
return obj;
}

在JavaScript中,还有其它方法能够模拟数值吗?有的,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
function zipCode(code, location) {
let _code = code;
let _location = location;

return {
code: function() {
return _code;
},
location: function() {
return _location;
}
};
}

通过上面的方式,便把_code以及_location给隐藏起来了,间接达到不可被修改的目的。

3.岔个题