js面试题

131 阅读1分钟

js事件循环机制

js 是单线程,用event loop实现一些非阻塞的事件。

宏任务和微任务:

宏任务:整体代码,setTimeout,setInterval,I/O操作

微任务:new Promise().then()指里面的回调,nextTick

为什么要有微任务?只有宏任务可以吗?

宏任务就是先进先出,当有高优先级任务时,引入微任务。

node中的事件循环和浏览器的区别

image.png node v10及以前 image.png

await 就相当于把函数放在promise里面,把后面的代码放在then里面 new primose里面也是一段宏任务,.then以后才是微任务

image.png setTimeout并没把resolve返回出去,只有返回了,then才执行 image.png

image.png

promise promise.all特性:接受一个数组。全部执行完后,输出结果。

里面不一定都是数组。 promise是在实例化的时候就执行完了,所以有的promise报错,也不影响其他promise输出。 平时await或then,只是为了拿到结果。

function PromiseAll(proArray) {
    return new Promise((resolve,reject)=>{////返回一个promise
        if(!Array.isArray(proArray)) { //先判断是不是数组
            return reject(new Error('输入数组'))
        }
        var len = proArray.length
        let count = 0
        var arr=[]
        for(let i=0;i<len;i++) {///let
            Promise.resolve(proArray[i]).then((res)=>{ // Promise.resolve会默认
                                               //把里面的东西转化成promise实例对象
                arr[i] = res
                count++
                if (count == len) {
                    resolve(arr)
                }
            }).catch(e => reject(e))
        }
    })
}

const pro1 = new Promise((res,rej) => {
    setTimeout(()=>{
        res('1')
    },1000)
})
const pro2 = new Promise((res,rej) => {
    setTimeout(()=>{
        res('2')
    },2000)
})
const pro3 = new Promise((res,rej) => {
    setTimeout(()=>{
        res('3')
    },3000)
})
const proAll = PromiseAll([pro1,pro2,pro3])
    .then(res =>
        console.log(res)
    )
    .catch((e) =>{
        console.log(e)
    })

promise 在每次实例化的时候已经执行了,做promise缓存。

前端优化

做优化的目的是什么? 哪个指标对业务有什么影响? 1 首屏时间 2 首次可交互时间

vue响应式原理

3个核心类: 1 observer 2 dep 3 watcher