美文网首页
排序,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