Skip to content

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

短期内要做的事情

Released under the MIT License.