zoukankan      html  css  js  c++  java
  • 面试题收集

    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);
        }
    }
  • 相关阅读:
    JBDC链接数据库
    js操作BOM对象
    打印倒正三角形
    window.onload事件
    js动态改变样式属性(className属性)
    js动态改变样式属性(style属性)
    js操作DOM对象(节点的增删改)
    easygen通用代码生成框架[开源]
    什么是真正的幸福与成功
    JVM学习笔记八:线程安全与锁优化
  • 原文地址:https://www.cnblogs.com/mengff/p/12855697.html
Copyright © 2011-2022 走看看