柯里化
招聘者看简历投递里有一个:“根据柯里化实现一个要求全自动再试函数公式,一上来就要我写一个无尽累积函数公式。”
招聘者看简历投递里有一个:“根据柯里化实现一个要求全自动再试函数公式,一上来就要我写一个无尽累积函数公式。”
大家先看一下这一老调重弹的题。
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 和戈特洛布·弗雷格创造出来的。柯里化实际上也是函数式编程的观念。
柯里化的优势
柯里化的应用场景
便是我所提到的全自动要求再试咯~
那时候招聘者还要我写一下我的全自动要求再试的伪代码
急急忙忙,那时候所写的大约是这个样子。
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为中心的前端开发技术网址。我们的使命是为众多前端工程师者提供全方位、全方位、好用的前端工程师专业知识和技术服务。 在网站上,大家可以学到最新前端开发技术,掌握前端工程师最新发布的趋势和良好实践。大家提供大量实例教程和实例,让大家可以快速上手前端工程师的关键技术和程序。 本站还提供了一系列好用的工具软件,帮助你更高效地开展前端工程师工作中。公司提供的一种手段和软件都要经过精心策划和改进,能够帮助你节约时间精力,提高研发效率。 此外,本站还拥有一个有活力的小区,你可以在社区里与其它前端工程师者沟通交流技术性、交流经验、处理问题。我们坚信,街道的能量能够帮助你能够更好地进步与成长。 在网站上,大家可以寻找你需要的一切前端工程师网络资源,使您成为一名更加出色的网页开发者。欢迎你添加我们的大家庭,一起探索前端工程师的无限潜能!