# 实现 add(1)(2)(3)

# 昨日回顾

# 实现 lodash 的_.get

function a1(object, paths, defaultValue) {
  paths = path.replace(/\[(\d+)\]/g, ".$1").split(".");
  let result = object;
  for (const p of paths) {
    result = Object(result)[p];
    if (result == undefined) {
      return defaultValue;
    }
  }
  return result;
}

function a2(object, paths, defaultValue) {
  return (
    paths.split(".").reduce((a, b) => (a || {})[b], object) || defaultValue
  );
}

# 今日解题

考点:函数柯里化
函数柯里化概念:柯里化(Currying)是把接受多个参数的函数转变为接受一个单一参数的函数,并返回接受余下的参数且返回结果的新函数的技术。

function add(...args) {
  console.log(args);
  return args.reduce((a, b) => a + b);
}
function currying(fn) {
  let args = [];
  return function temp(...newArgs) {
    if (newArgs.length) {
      args = [...args, ...newArgs];
      return temp;
    } else {
      let val = fn.apply(this, args);
      args = [];
      return val;
    }
  };
}
let addCurry = currying(add);
console.log(addCurry(1)(2)(3)(4, 5)()); //15
console.log(addCurry(1)(2)(3, 4, 5)()); //15
console.log(addCurry(1)(2, 3, 4, 5)()); //15

# 柯里化的好处

  • 提高实用性
  • 延迟执行 【累积传入的参数,最后执行】
  • 固定易变元素【最典型的代表应用:bind 函数用以固定 this 这个易变的对象】