祝大佬能顺利通过面试。

我是来学***佬的面试题的......

3.设计一个函数,能实现构造函数创建对象
思路:模拟new的具体过程


function createObj(parent,...args){
     if(typeof parent !== 'function')
           throw new TypeError('constructor is not a function.');
    var obj = Object.create(parent.prototype);
    parent.apply(obj, args);
    return obj;
}

4.设计一个栈,不使用数组。
思路:链表实现,push、pop时间复杂度为O(1).


function Stack(){
    var Node = function(val,next){
        this.val = val;
        this.next = next || null;
    }
    // 创建虚拟头结点
    var dummyHead = new Node(-1);
    var size = 0;

    this.push = function(val){
        var node = new Node(val, dummyHead.next);
        dummyHead.next = node;
        size++;
    }    

    this.pop = function(){
        if(!dummyHead.next)
            return undefined;        
        var node = dummyHead.next;
        var val = node.val;
        dummyHead.next = node.next;        
        size--;
        return val;
    }

    this.getSize =  function(){
        return size;
    }

    this.isEmpty = function(){
        return size === 0;
    }
}

16.防抖操作
思路:防抖就将多次操作融合为一次操作
可以先延时,后执行(immediate=false)
也可以立即执行,然后延时(immediate=true)


function debounce(func, wait, immediate){

    let context,args,timer;
    let later = function(){
        return setTimeout(() => {
            timer = null;
            if(!immediate){
                func.apply(context, args);
            }            
        }, wait);
    }
    return function(...params){        
        if(!timer){
            timer = later();
            if(immediate){ // 需要被立即执行
                func.apply(this,params);
            }else{
                context = this;
                args = params;
            }
        }else{
            clearTimeout(timer);
            timer = later();
        }
    }
}

归并排序,有点复杂好像,不太会。
ajax和fetch的区别,啥来着。。。