督促学习之——徒手撕代码(深拷贝和sleep函数)

104 阅读3分钟

科目:手写代码(深拷贝和sleep函数)
时间:2023年7月20日
目的:为了让我这上了年纪不记事的大脑,不再看一段忘一段(好记性不如烂笔头嘛),现在,重新再走一遍手写代码!!!并且!记录下来!督促自己!看了这篇文章相信可以加深你的理解和记忆!!!

好的,正片开始!!!!!
请放下一切杂念跟着我走!!!

一、手写深拷贝

第一步:先准备好目标“对象”!没有的来我这儿,我教你咋复制“对象”

const target = {
    name: 'xiaoFang',
    age: 18,
    info: {
        height: 168,
        weight: 98,
        saying: {
            message: '今晚月色真美'
        }
    },
    address: {
        city: '北京'
    },
    hobby: ['吃饭', '睡觉']
}

第二步:准备好“作案”工具

const myGrilfrieng = {}  //现在开始准备好存放“对象”的容器
function deepCopyGrilFriend(target, myGrilfrieng) {
  // 1、因为对象有很多东西,需要咱逐个来 copy,所以先想到循环 copy
  for (let idx in target) {
    // 2、来想想,对象能有几类部分?对象?数组?简单类型?再来判断这是哪个部分
    if (Object.prototype.toString.call(target[idx]) === '[object Object]') {
      // 这部分太复杂了,要将这部分抽离出来继续细化 copy
      // 要先将“容器”的对应这部分给它个更精细的容器来存放
      myGrilfrieng[idx] = {}
      deepCopyGrilFriend(target[idx], myGrilfrieng[idx]) // 这里咱就让他递归,直到碰到最简单的直接复制!
    } else if (Object.prototype.toString.call(target[idx]) === '[object Array]') {
      // 同上!!!
      myGrilfrieng[idx] = []
      deepCopyGrilFriend(target[idx], myGrilfrieng[idx])
    } else {
      // 3、如果找到了简单的部分,那咱就直接复制
      myGrilfrieng[idx] = target[idx]
    }
  }
}
// 最后!万事俱备只差东风!开启方法!深度拷贝!
deepCopy(target, myGrilfrieng)
console.log(target, myGrilfrieng,11111111)
target.info.saying.message = '风也温柔'
console.log(target, myGrilfrieng,22222) // 用来试试,深拷贝是否成功。。。

二、sleep函数

目的:实现一个 sleep 函数,接收一个参数为时间(ms),可以控制执行函数等待值为参数的时间后再返回结果。

第一步:准备好架构!!!

//1、 首先有一个 sleep 函数,传入一个时间,能够让执行函数睡一会。
cosnt sleep = (time) => {}
//2、 准备执行函数
const soTired = () => {
  console.log('我困了!!!想睡觉!!!')
  sleep(time) // 别把这个参数漏了哦!!!
  console.log('我醒了!!!')
}
//3、 最后调用它!让它跑一会!
soTired()

第二步:思考:怎么样实现等它睡够了才醒呢?

1、这就要用到 js 的特性啦!事件循环!然后!
2、都想到事件循环了,还想不到 setTimeout 嘛?要设置规定时间才能睡够醒过来。
3、但是正常情况下,只用一个 setTimeout 是不够的,那就得把 await(等一等) 搬出来啦!
4、既然用到 await 了,那就说明 sleep 中返回的是 promise 嘛!

开始撕:

const sleep = (time) => {
  return new Promise((a, b) => {
    console.log('我要开始睡觉啦!!!')
    setTimeout(a, time)
  })
}
const soTired = async (a, time) => {
  console.log('我困了!!!想睡觉!!!')
  await sleep(time)
  console.log(a)
}
soTired('我睡醒了!!!', 2000)

最后结尾:文章写得不太好,还很生疏,不过,忍一忍就过去了哈哈哈(开个玩笑),总有一天我会写出很好文章的(进步会很快的)。
^v^。感谢看完!!!