一、对象冻结与深度冻结
冻结后的对象不能被修改
function constTize(obj){
if(Object.isFrozen(obj)){
return obj
}
// Vue3源码=》Reflect.ownKeys(obj)
Object.keys(obj).forEach(key => {
// 深度冻结
typeof obj[key] === "object" && (obj[key] = constTize(obj[key]))
})
return Object.freeze(obj)
}
const obj = {
a: {
b" 2
},
c: 123
}
// 浅拷贝
const demoObj = constTize(obj)
try{
demoObj.a.arr = []
}catch(error) {
console.log(error.message)
}
console.log(demoObj)
二、async与await
function sleep(second) {
return new Promise() {
setTimeout(()=>resolve(second),second)
}
}
async function test() {
console.log('开始')
await sleep(2000)
console.log('结束')
}
test()
function sleep(second) {
return new Promise(resolve => {
setTimeout(()=> {
console.log(Math.random())
resolve()
},second)
})
}
async function demo1() {
await sleep(2000)
await sleep(2000)
await sleep(2000) // 线程休眠
}
async function demo2() {
let task = [];
for (let i =0;i<3;i++){
tasks.push(sleep(2000))
}
await Promise.all(tasks)
}
// Promise.all可以实现并发
// acyns await 串行
三、js闭包
1.闭包是什么
let abc = 456
function a() {
let aa = 123;
console.log(aa)
}
a(); // 作用域不同
a(); // 访问的不是同一个aa
// AO临时活动对象, 执行完毕之后,销毁 再创建
2.常见应用场景
a.防抖节流 ---延长了局部变量的生命周期 b.Vue data()体现了---闭包的封闭性,创建私有空间