1207 今日总结
今日工作
今日心情
所见所想,有感而发
今日算法
今日学习:
今日复习:
手撕代码
防抖节流等各种手写,http和网络,浏览器原理,性能优化,Webpack
函数柯里化:柯里化是把接受 多个参数 的函数变换成接受 一个单一参数 的函数,并且返回接受余下的参数而且返回结果的新函数的技术。
开始默写:
js
let curry = fn => {
return function curriedFn(...args) {
if (args.length < fn.length) {
// 递归调用 curriedFn,参数累计到 fn 的参数后就立即执行 fn(args),否则一直递归自己——加参数
return function() {
return curriedFn.apply(null, [...args, ...arguments])
}
}
return fn.apply(null, args)
}
}
const sum = (x, y, z) => x * y * z * 10;
const curriedSum = curry(sum)
console.log(curriedSum(2)(3)(4))
. . .
继续阅读:
- 一元函数: 只接受一个参数的函数称为一元(unary)函数。
js
const add = (x) => x * 2;
add(2)
// 一个嵌套的一元函数
const addCurried = x => y => x + y;
addCurried(2)(3)
- 二元函数: 只接受两个参数的函数称为二元(binary)函数。
js
const add = (x, y) => x + y;
add(2,3)
- 变参函数: 变参函数是接受可变数量参数的函数。
js
// eg: addCurried(2)(3)
// eg: addCurried(2)(3,4,5,6)
// eg: addCurried(2)(3,4)(5,6)
// ...
- 柯里化: 柯里化是把一个 多参数函数 转换为一个 嵌套的 一元函数 的过程。
实现二元函数的柯里化:
js
const curry = (fn1) => {
return function (args1) {
return function (args2) {
return fn1(args1, args2)
}
}
}
const add = (x, y) => x + y;
let autoCurriedAdd = curry(add)
const res = autoCurriedAdd(2)(3)
console.log('res', res) // 5
实现更多参数的函数柯里化:
js
const curry = (fn) => {
if (typeof fn !== 'function') {
throw Error('Not a Function')
}
return function curriedFn (...args) {
// 实际接受的参数个数 是否小于 柯里化的函数 的参数个数
if(args.length < fn.length) {
// 若小于,返回一个函数去接收
return function (...argsOther) {
return curriedFn.apply(null, args.concat(argsOther))
}
} else {
return fn.apply(null, args)
}
}
}
const sum = (x, y, z) => x * y * z * 10;
console.log(curry(sum)(2)(3)(4))
更多柯里化:背诵默写
js
let curry = fn => {
return function curriedFn(...args) {
if (args.length < fn.length) {
// 递归调用 curriedFn,参数累计到 fn 的参数后就立即执行 fn(args),否则一直递归自己——加参数
return function() {
return curriedFn.apply(null, [...args, ...arguments])
}
}
return fn.apply(null, args)
}
}
const sum = (x, y, z) => x * y * z * 10;
const curriedSum = curry(sum)
console.log(curriedSum(2)(3)(4))
柯里化 实际应用:
js
let curry = fn => {
return function curriedFn(...args) {
if (args.length < fn.length) {
// 递归调用 curriedFn,参数累计到 fn 的参数后就立即执行 fn(args),否则一直递归自己——加参数
return function () {
return curriedFn.apply(null, [...args, ...arguments])
}
}
return fn.apply(null, args)
}
}
let curriedMatch = curry((expr, str) => str.match(expr))
// 使用了一个 expr 参数,还有一个 str 参数
let hasNumberFn = curriedMatch(/[0-9]+/)
// 使用了 fn 参数,还要一个 array 参数
let curriedFilterFn = curry((fn, array) => array.filter(fn))
let findNum = curriedFilterFn(hasNumberFn)
console.log(findNum(['aaa', 'bb2', '33c', 'ddd', ]))
好文推荐
有感好文
项目/博客推荐
值得学习的项目/作者
面经相关
八股文相关
明日计划
- 算法:
- 学习:
- 复习:
- 手写:
- 面经复习:
TODOS
短期内要做的事情