美文网首页
排序,bind() call() apply()原生实现

排序,bind() call() apply()原生实现

作者: 衣裳云墨 | 来源:发表于2020-12-20 16:21 被阅读0次

    一:排序

    1、插入排序

    function sort(arr) {//原地
     for (let i in arr) {//选一个元素
      while (i>0&&arr[i]<arr[i-1]) {//向前移动到合适的位置
       [arr[i],arr[i-1]]=[arr[i-1],arr[i]]
       i--
      }
     }
    }
    

    2、快速排序

    function sort(arr) {
     if (arr.length<=1) return arr
    
        //选基准值
     let mid_pos=arr.length>>1
     let mid=arr.splice(mid_pos,1)[0]
    
     let left=[],right=[]
    
        //和基准值比较,分别插入left,right数组
     arr.forEach(item=>(item<=mid?left:right).push(item))
    
     return [...sort(left),mid,...sort(right)]//递归调用排序
    }
    

    二:原生API实现

    1、apply()

    Function.prototype.myApply=function(context,args) {
     context.fn=this//为context设置函数属性
     let result=context.fn(...args)//调用函数
     delete context.fn//删除context的函数属性
     return result
    }
    

    2、call()

    Function.prototype.myCall=function(context,...args) {
     context.fn=this
     let result=context.fn(...args)
     delete context.fn
     return result
    }
    

    3、bind()

    Function.prototype.myBind=function(context,args1) {//使用[闭包+apply]实现
     return (...args2)=>this.apply(context,[...args1,...args2]);
    }
    

    4、reduce()

    Array.prototype.myReduce=function(fn,init_val){
     let [val,idx]=init_val?[init_val,0]:[this[0],1]//设置初始值
     for (let i=idx,len=this.length;i<len;i++) {
      val=fn(val,this[i],i,this)//循环并迭代结果
     }
     return val
    }
    
    

    相关文章

      网友评论

          本文标题:排序,bind() call() apply()原生实现

          本文链接:https://www.haomeiwen.com/subject/bmdknktx.html