面试题收集

1. 实现一个add方法

add(1)(2,3)(4).value()  //输出: 10

分析:对柯里化函数进行改造

原curry函数

function curry(f,...args1){
    const inner = (...args2) => {
        const args = [...args1,...args2];
        return args.length == f.length ? f(...args) : curry(f,args);
    }
    return inner;
}

改造后curry函数

复制代码
function curry(f,args1=[]){
    const inner = (...args2) => {
        return curry(f,args1.concat(args2));
    }
    //添加value方法
    inner.value = function(){
        return f(...args1);
    }
    return inner;
}
复制代码

柯里化方法

function originalAdd(...nums){
    return nums.reduce((pre,cur) => {
        return pre + cur;
    })
}

let add = curry(originalAdd);
console.log('cur:', add(1)(2,3)(4).value());

 

2.实现一个异步队列Queue,要求按时间依次执行callback

new Queue().task(1000, function () {
    console.log(1);
}).task(2000, function () {
    console.log(2);
}).start()

分析:task方法只收集参数,在start方法中,将参数转化为promise,并立即执行

复制代码
class Queue{
    tasks=[]
    task(time,fn){
        this.tasks.push([time,fn])
        return this;
    }
    start(){this.tasks.reduce((pre,cur) => {
            return pre.then((data) => toPromise(...cur,data)); 
        },Promise.resolve());
    }
}

function toPromise(time,fn,data){
    return new Promise((reslove) => {
        setTimeout(() => {
            reslove(fn());
        },time);
    })
}
复制代码

start也可以使用await执行串行Promise,这样传递data不太方便

async start(){
    for(let task of this.tasks){
        await toPromise(...task);
    }
}

 

posted @   全玉  阅读(190)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2018-05-09 手指滑动方向判断
2018-05-09 元素滚到到底部原理
点击右上角即可分享
微信分享提示