js基础函数

72 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情

使用setTimeout写一个setInterval

使用setTimeout实现setInterval不过是将setTimeout包装成一个函数,在setTimeout方法执行完毕后,重新调用一下这个函数而已

function interval (cb, time = 0) {
  let timer = null
  let myInterval = () => {
    timer = setTimeout(() => {
      cb()
      myInterval()
    }, time)
  }
  myInterval()
  return () => {
    clearTimeout(timer)
  }

}
var clearInterval= interval(() => {
  console.log(23)
}, 1000)
setTimeout(() => {
  clearInterval()
}, 3000)

使用setInterval实现setTimeout

使用setInterval实现setTimeout不过是,将setInterval定时器首次执行完毕后就立即清空这个计时器。不知道这个无聊的问题,发起人的目的是什么

function mySetTimeout (cb, delay) {
  let timer = setInterval(() => {
    cb()
    clearInterval(timer)
  }, delay)
}

mySetTimeout(() => {
  console.log('ok')
}, 3000)

防抖

防抖的目的是避免频繁的函数调用浪费性能,所以假如函数一直被调用,那么这个函数一直也不会执行,直到触发这个函数执行的动作结束后,函数才真的执行

function debounce (fn, delay) {
  let timer
  return function (...res) {
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(function () {
      fn.apply(null, res)
      timer = null
    }, delay)
  }
}

节流

节流的目的就是让函数在一定时间段内最多触发一次。防止重复处罚浪费性能。将 fn.apply(null, res) 写在定时器的前面,初次触发函数会立即执行,如果放在里面,初次触发的时间将是在这个限制时间结束后。

function throttle (fn, delay) {
  let timer
  return function (...res) {
    if (timer) {
      return
    }
    fn.apply(null, res)
    timer = setTimeout(function () {
      timer = null
    }, delay)
  }
}

比较两个非同一个引用对象是否相同

比的不是内存地址,而是每个对象的属性是否完全相同,预期是期望 const obj1 = { a: 100, b: { x: 10, y: 20 } }

const obj2 = { a: 100, b: { x: 10, y: 20 } } 这两个对象相同

// isEqual
function notObj (o) {
  return typeof o !== 'object' || o === null
}
function isEqual (obj1, obj2) {
  if (notObj(obj1) || notObj(obj2)) {
    return obj1 === obj2
  }
  const key1 = Object.keys(obj1)
  const key2 = Object.keys(obj2)
  if (key1.length !== key2.length) {
    return false
  }
  for (const key in obj1) {
    const res = isEqual(obj1[key], obj2[key])
    if (!res) {
      return false
    }
  }
  return true
}