call,apply,bind源码,防抖 节流, reduce

1.call

Function.prototype.myCall = function(context){
  if(typeof this !== 'function'){
   throw() 
 }
 context = context || window
 const args = [...arguments].slice(1)
 content.fn = this
 const result = content.fn(...args)
  delete content.fn
return result 
}
var obj = {
  name: 'zs',
  objAge: this.age,
  myFun: function(fm,t){
    console.log(this.name+this.age+fm+t)
  }
}
var db= {
  name: 'ls',
  age: 99
}
obj.myFun.myCall(db,'aaa','ss')

2.apply

Function.prototype.myApply = function(context){
  if(typeof this !== 'function'){
   throw() 
 }
context = context || window
let result
if(arguments[1]{
  result = context.fn(...arguments[1])
} else {
  result = context.fn()
}
  delete content.fn
  return result 
}
var obj = {
  name: 'zs',
  objAge: this.age,
  myFun: function(fm,t){
    console.log(this.name+this.age+fm+t)
  }
}
var db= {
  name: 'ls',
  age: 99
}
obj.myFun.myApply(db,'aaa','ss')

3.bind()

Function.prototype.myBind = function(context){
  if(typeof this !== 'function'){
    throw new Error
  }
  const _this = this
  const args = [...arguments].slice(1)
  return function F(){
    if(this instanceof F){
      return new _this(...args,...arguments)
    }
    return _this.apply(context,args.concat(...arguments))
  }
}
var obj = {
  name: 'zs',
  objAge: this.age,
  myFun: function(fm,t){
    console.log(this.name+this.age+fm+t)
  }
}
var db= {
  name: 'ls',
  age: 99
}
obj.myFun.myBind(db,'aaa','ss')('huj')
  1. instanceof
function myInstanceof (left, right){
  const protoType = right.protoType
  let left = left.__proto__
  while(true){
    if(left===null||left===undefined)
      return false
    if(left === protoType)
      return true
    left = left.__proto__
  }
}

4.map

Array.prototype.myMap = function(callback){
  if (typeof callback !== 'function') {
    throw new Error(`${callback} is not a function`)
  }
  let newArr = []
  for(let i = 0;i<=this.length;i++){
    newArr.push(callback(this[i],i,this))
  }
  return newArr
}

5.reduce

Array.prototype.myReduce = function(fn,pre){
  if(!Array.isArray(this) || this.length===0 || typeof fn !== 'function'){
    return []
  }
  var value = pre?pre:this[0]
  for(var i =pre?0:1;i<this.length;i++){
    value = fn(value,this[i],i,this)
  }
  return value
}
// 加法
var arr = [1,2,3,4]
var result = arr.reduce((pre,cur)=>{
  return pre+cur
})
// 去重
var arr1 = [1,2,3,4,3,2]
var result1 = arr1.myReduce((pre,cur)=>{
  if(pre.indexOf(cur)===-1){
    pre.push(cur)
  }
  return pre
},[])
console.log(result1)
// 数组的去重
let ary = [12,32,45,34,2,34,32,12];
let arr = [...new Set(ary)];
let arr = Array.from(new Set(ary));
console.log(arr)

// map from用法
const mapper = new Map([['1', 'a'], ['2', 'b']]);
//Map { '1' => 'a', '2' => 'b' }
// const mapper = new Map([[1, 2], [2, 4], [4, 8]]);
console.log(mapper,Array.from(mapper))
// [ [ '1', 'a' ], [ '2', 'b' ] ]

// 扁平化
var arr2 = [1,[2,3,[4,6]]]

var arrFun = function(arr){
  return arr.myReduce((pre,cur)=>{
   return pre.concat(Array.isArray(cur)?arrFun(cur):cur)
  },[])
}
arr2.flat(Infinity)
// 数组扁平化的N种实现方案
// 1.es6 flat
// 2.转换为字符串 toString
// 3.转换为JSON格式字符串 Stringfy 去掉'[]'
// 4.基于数组some方法
// 统计次数
var arr4 = [1,3,4,6,8,3,4]
var result4 = arr4.reduce((pre,cur)=>{
  if(cur in pre) {
    pre[cur]++
  } else {
    pre[cur]=1
  }
  return pre
},{})
console.log(result4)

6.防抖 节流

// 所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
function debounce(fn,timer){
  var t = null;
  return function(){
    clearTimeout(t)
    t = setTimeout(()=>{
      fn.apply(this,arguments)
    },timer)
  }
}
btn.addEventListener('click',debounce(submit,2000),false)
function submit(as){
  console.log(1,as)
}
// 所谓节流,就是指连续触发事件但是在 n 秒中只执行一次函数。
function throttle(delay,callback){
  var timer
  return function(){
    timer=setTimeout(function(){
      if(!timer) {
        callback()
        timer = null
      }
    },delay)
  }
}
  1. 浅拷贝
function shallwCopy(obj){
  var targetObj = {}
  for(var i in obj){
    targetObj[i]= obj[i]
  }
  return targetObj
}
var person = {
  name: 'zs',
  hobby: [1,2,35,5]
}
var person1 = shallwCopy(person)
person1.name='ls'
person1.hobby[0]='fff'
console.log(person)
console.log(person1)
  1. 深拷贝
function deepCopy(obj){
  var result = {};
  for(var k in obj){
      if(typeof obj[k] == "object"){
          //要将这个属性再进行一次拷贝
          var temp = {};
          for(var j in obj[k]){
              temp[j] = obj[k][j]
          }
          result[k] = temp;
      }else{
          //值类型的数据直接复制即可
          result[k] = obj[k];
      }
  }
return result;
}
function deepClone(obj){
  var cloneObj = {}
  if(obj===null) return obj
  if(typeof obj !== 'object') return obj
  for(var i in obj){
    if(obj.hasOwnProperty(i)){
      cloneObj[i] = deepClone(obj[i])
    }
  }
  return cloneObj
}
var person = {
  name: 'zs',
  hobby: [1,[467,5465],2,35,5]
}
var person1 = deepClone(person)
person1.name='ls'
person1.hobby[0]='fff'
console.log(person)
console.log(person1)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容