JS重难点解析

142 阅读1分钟

一、对象冻结与深度冻结

冻结后的对象不能被修改

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()体现了---闭包的封闭性,创建私有空间