面试题输出打印结果总结

1.宏任务,微任务

async function async1() {
  console.log(1);
  const result = await async2();
  console.log(3);
}

async function async2() {
  console.log(2);
}

Promise.resolve().then(() => {
  console.log(4);
});

setTimeout(() => {
  console.log(5);
});

async1();
console.log(6);

输出的结果顺序为:1,2,6,4,3,5
题解:

  1. 首先js的函数执行是在调用的地方开始函数的执行,所以先跳过前两个 async 函数。
  2. 然后 promise 函数,因为Promise.then中注册的回调是异步执行的,所以应该将 4 放在微任务队列中
  3. 遇到setTimout,异步宏任务,放入宏任务队列中;
  4. 然后调用了async1(),async1() 中的 console.log(1);是同步执行的,所以首先打印了1 ,await 后面紧跟着async2 函数执行,所以打印了 2 ,async2 函数返回的 Promise ,所以 console.log(3) 放在微任务队列中,此时微任务队列中有【4,3】,接着执行了下一个同步任务 6
    此时同步任务已经执行完毕,我们去到异步的事件队列中找,先执行微任务,此时微任务中有【4,3】,所以打印接下来打印 43 ,微任务宏任务的打印顺序按照存储的顺序打印,所以 3 在 4 的后面
  5. 最后执行宏任务中的 5

2.对象作为key会转为[object,object]

let a = {a: 10};
let b = {b: 10};
let obj = {
  a: 10
};
obj[b] = 20;
console.log(obj[a]);

这道题的答案是:20
题解:

1.obj [ b ] = 20;
相当于 obj [ {b: 10} ] = 20;对象做为 key 时被强制转为了 [object,object],所以此时 obj 的值为:

 obj = {
     a: 10[object,object]:20
 };
  1. 打印 obj [a] 时,由于 a 是一个对象,所以被强制转换为了 **[object,object],**就相当于打印 obj[’[object,object]’],所以最后输出的结果为 20

猜你喜欢

转载自blog.csdn.net/weixin_48786946/article/details/106904687