科目:手写代码(深拷贝和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)