使用ES6中的剩余参数和展开运算符巧妙实现柯里化
1.什么是柯里化?
柯里化(Currying):柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术
通俗的讲:柯里化是一种将使用多个参数的一个函数转换成一系列使用一个参数的函数的技术
2.什么是剩余参数和展开运算符(展开语法)?
剩余参数:ES6的剩余参数专门用于收集末尾的所有参数,将其放置到一个形参数组中。
语法如下:
function (...形参名){}
例子:
function print(a, b, c, ...args) {
console.log(a, b, c); //1 2 3
console.log(args); //[4, 5, 6, 7]
}
print(1, 2, 3, 4, 5, 6, 7);
注意: 一个函数,仅能出现一个剩余参数,且剩余参数必须是最后一个参数
展开运算符:用代码说明一下吧
使用方式:...要展开的东西数组或对象
//展开数组的每一项
const arr = [1, 2, 3, 4, 5];
console.log(...arr); // 1 2 3 4 5
//浅层克隆对象
const obj = {
name: '前端',
sex: '男',
age: 22
}
const newObj = { ...obj };
console.log(newObj); //{name: "前端", sex: "男", age: 22}
3.ES6实现柯里化
//curry柯里化函数
function curry(func, ...args) {
return function (...subArgs) {
const allArgs = [...args, ...subArgs];
if (allArgs.length >= func.length) {
//传入的实参数量>=func的形参数量,让func执行
return func(...allArgs);
} else {
//传入的实参数量<func的形参数量,继续
return curry(func, ...allArgs);
}
}
}
//定义一个print函数,根据执行结果测试curry
function print(a, b, c, d, e) {
return [a, b, c, d, e];
}
//直接传满参数执行print
console.log(print(1, 2, 3, 4, 5)); //[1, 2, 3, 4, 5]
//curry处理
const print1 = curry(print, 1, 2);
const print2 = curry(print1, 3);
console.log(print2(4, 5)); //[1, 2, 3, 4, 5]