柯里化招聘者看简历投递

lxf2023-12-18 01:20:02

柯里化

招聘者看简历投递里有一个:“根据柯里化实现一个要求全自动再试函数公式,一上来就要我写一个无尽累积函数公式。”

大家先看一下这一老调重弹的题。

fn(1)(2)(3)()
// ans = 6

换句话说,大家数次启用,然后最后导出一个 6。

这道题自然就是不会太难的,我就直接把回答放在这里了。

我那时写第一种方式时出些 bug,之前有一个传递数据不正确,搞得我 debug 了五分钟没冒出来(

function reduce(...args) {
  return args.reduce((x, y) => x   y)
}
function currying(fn) {
  let args = []
  return function temp(...newArgs) {
    if(newArgs.length > 0) {
      args = [...args, ...newArgs]
      return temp
    } else {
      const val = fn.apply(this, args)
      args = []
      return val
    }
  }
}
const fn = currying(reduce)
console.log(fn(1)(2)(3)())

于是我就马上换了一种我更加熟悉的书写

const sum = (...args) => {
  const f = (...newArgs) => sum(...args, ...newArgs)
  f.valueOf = () => args.reduce((x, y) => x   y, 0)
  return f
}
console.log(sum(1)(2)(3).valueOf())

那样获得回答后招聘者就没说啥了,觉得应该是 ok 的。

随后跟我说柯里化这个概念。

这一下让我不清楚了,我没记具体概念,大约讲的是“应用闭包完成反复启用。”

招聘者没说啥,但我感觉自己表达的并不是很了解。

柯里化这个概念

在计算机中,柯里化(英文:Currying ),又译成卡瑞化或加莫化,就是将接纳好几个参数函数变换成进行一个单一主要参数(最开始函数公式的第一个主要参数)的函数公式,而且回到接纳剩下参数值,并且返回结果的全新函数技术性。

这个技术由克里斯托夫·斯特雷奇以社会学家哈斯凯尔·加莫命名,虽然这是 Moses Schönfinkel 和戈特洛布·弗雷格创造出来的。柯里化实际上也是函数式编程的观念。

柯里化的优势

  1. 单一标准:在函数式编程中,通常是让一个函数处理难题尽量单一,而不是一个函数公式解决好几个每日任务。
  2. 提升可维护性及其减少程序代码可重复性

柯里化的应用场景

便是我所提到的全自动要求再试咯~

那时候招聘者还要我写一下我的全自动要求再试的伪代码

急急忙忙,那时候所写的大约是这个样子。

function autoRetry(fn, maxTryTime) {
  // 复位要求逐渐频次
  let tryTime = 0
  return function tryFunc(...args) {
  // 开展要求
   try {
    fn.apply(this, ...args)
   } catch {
    if (tryTime < maxTryTime) {
      return tryFunc
    } else {
      // 处理错误
    }
   }
  }
}

深拷贝的循环引用

第三个难题仿佛就是要我写一个深拷贝,也算是基本题型了。

我迅速写出来了,说了一嘴 A.A = A 是循环引用

function deepClone(target, map = new WeakMap()) {
  if (typeof target === 'object') {
    const newTarget = Array.isArray(target) ? [] : {}
    if (map.get(target)) return map.get(target)
    for(const key in target) {
      newTarget[key] = deepClone(target[key])
    }
    map.set(target, newTarget)
    return newTarget
  } else {
    return target
  }
}

随后招聘者要我详细解释一下循环引用,然后我就蒙住,A.A = A 不足咩。

他说道:“那样表述,我就是不明白的。”

我查下

循环引用是个什么

就像我们有这样的一个目标

柯里化招聘者看简历投递

大家可以看到循环引用是这样子的

柯里化招聘者看简历投递

我们在进行复制时,会递归算法地进行复制一刻不停,因此会导致循环引用。

因此你看我的编码,有一个 weakMap,他保存了映射关系,再次发生直接使用以前的就可以了,不会一直 deepClone 下来。

那这便是此次文章内容的相关内容啦。

我们下期再见~

本站是一个以CSS、JavaScript、Vue、HTML为中心的前端开发技术网址。我们的使命是为众多前端工程师者提供全方位、全方位、好用的前端工程师专业知识和技术服务。 在网站上,大家可以学到最新前端开发技术,掌握前端工程师最新发布的趋势和良好实践。大家提供大量实例教程和实例,让大家可以快速上手前端工程师的关键技术和程序。 本站还提供了一系列好用的工具软件,帮助你更高效地开展前端工程师工作中。公司提供的一种手段和软件都要经过精心策划和改进,能够帮助你节约时间精力,提高研发效率。 此外,本站还拥有一个有活力的小区,你可以在社区里与其它前端工程师者沟通交流技术性、交流经验、处理问题。我们坚信,街道的能量能够帮助你能够更好地进步与成长。 在网站上,大家可以寻找你需要的一切前端工程师网络资源,使您成为一名更加出色的网页开发者。欢迎你添加我们的大家庭,一起探索前端工程师的无限潜能!