本文章是个人刷题记录,刷题来源来自于: 「2021」高频前端面试题汇总之代码输出结果篇
一、异步&事件循环
说明:原文档里提供的输出答案有些未参照规范,比如出现了状态为resolved值(应该为fulfilled),输出结果最好亲自在浏览器控制台打印一下。
| 题号 | 通过 | 知识点 | 第二次 |
|---|---|---|---|
| 1 | √ | √ | |
| 2 | ❌ | prosmise的返回 | √ |
| 3 | ❌ | 在宏任务执行时,添加了一个微任务,此时是先执行这个微任务还是继续执行宏任务? | √ |
| 4 | ❌ | 考察Promise的静态方法resolve; 在当前宏任务执行时,添加了一个微任务,执行完当前宏任务后还有其他宏任务,此时是执行其他宏任务还是执行微任务? | √ |
| 5 | √ | √ | |
| 6 | ❌❌❌ | Promise.then参数为非函数(基础类型数据或各种状态的promise),将会如何? | √ |
| 7 | ❌❌❌ | then中的回调函数里抛出错误(注意不是return错误) | √ |
| 8 | √ | √ | |
| 9 | ❌ | 注意是return还是throw错误 | √ |
| 10 | ❌ | then方法可以返回promise对象,但是不能返回自身,否则会抛出错误。 | √ |
| 11 | √ | √ | |
| 12 | ❌❌❌ | 错误捕捉 | ❌ |
| 13 | ❌❌ | finally的返回值;注意多个then的执行顺序 | ❌ |
| 14 | ❌ | 答案好像错误了,知晓all方法的源码 | √ |
| 15 | ❌❌ | 看就完事了...注意all是捕捉第一个错误的,此时改变了就不再捕获第二个错误 | √ |
| 16 | √ | 勉勉强强通过,15会了这题自然会了 | √ |
| 17 | √ | √ | |
| 18 | ❌ | async,await后面的语句相当于放到了new Promise中,下一行及之后的语句相当于放在Promise.then中 | ❌❌ |
| 19 | ❌ | √,再看一遍 | |
| 20 | ❌❌❌❌❌❌ | √,再看一遍 | |
| 21 | √ | √ | |
| 22 | √ | 做对了,不过建议再看一遍 | √ |
| 23 | ❌❌❌❌❌❌ | async函数中抛错 | ❌❌❌ |
| 24 | ❌ | setTimeout里的console.log(p)执行了... | √ |
| 25 | √ | √ | |
| 26 | ❌ | 与24一样;需要注意的是最后一个定时器打印出的p1其实是.finally的返回值 | √ |
| 27 | √ | process.nextTick是微任务 | |
| 28 | √ | ||
| 29 | √ | ||
| 30 | ❌ | ||
| 31 | ❌ | promise执行器里resolve方法之后的代码还会执行 |
- Promise的状态在发生变化之后,就不会再发生变化;
- promise的构造函数中,在resolve方法的执行后,即状态改变时将
promise.then推入微任务队列,此时还不会去执行这个微任务,还会执行resolve下行的同步代码;注意跟await不要混淆,看18、19题 - 在执行宏任务时,创建了一个微任务,此时会继续执行完这个宏任务,再去执行微任务,再执行其他宏任务
- Promise.resolve方法。参数如果是一个原始值,或者是一个不具有then方法的对象,则Promise.resolve方法返回一个新的Promise对象,状态为resolved,Promise.resolve方法的参数,会同时传给回调函数。 Promise.reject方法同理。
- Promise.resolve('foo') 等价于 new Promise(resolve => resolve('foo'))
- then方法。
-
参数并非是一个函数(promise或原始值),它实际上会将其解释为then(null),这就会导致前一个Promise的结果会传递下面。
-
如果方法返回的是一个Resolved状态/Rejected的Promise,其resolve或reject的参数值将会传递到下一个then方法的resolve或reject参数。如果方法返回的是一个pending状态的promise,下一个then方法返回的promise也是pending状态,两者同时更改状态。then方法没有返回值,则表示返回的是Promise{:undefined}。then方法可以返回promise对象,但是不能返回自身,否则会抛出错误。
-
then中的回调函数抛出一个错误,then返回的Promise将会成为Rejected状态,并且将抛出的错误作为Rejected状态的回调函数的参数值。错误值可以在下一个回调函数中用err.message取到。(注意是return还是throw错误)
-
二、this
| 题号 | 通过 | 知识点 | |
|---|---|---|---|
| 1 | √ | √ | |
| 2 | ❌ | 再看一下就知道了 | ❌ |
| 3 | √ | √ | |
| 4 | ❌ | √ | |
| 6 | ❌ | 箭头函数父级构不成作用域 | √ |
| 7 | ❌ | 立即执行匿名函数的this | √ |
| 8 | ❌ | 立即执行匿名函数的this | |
| 9 | ❌ | grguments | |
| 10 | √ | ||
| 11 | √ | 再看一遍 | |
| 12 | √ | ||
| 13 | ❌ | ||
| 14 | √ | ||
| 15 | √ |
三、作用域&变量提升&闭包
| 题号 | 通过 | 知识点 | |
|---|---|---|---|
| 1 | ❌ | ||
| 2 | ❌ | 同1 | |
| 3 | ❌ | ? 立即执行函数, 同8 | ❌ |
| 4 | √ | ||
| 5 | √ | ||
| 6 | √ | ||
| 7 | ❌❌ | 调用值赋值给了变量就形成了闭包,blog.csdn.net/Yannnnnm/ar… | |
| 8 | ❌❌ | !!!与第三题一起看,还考察了类型转换,答案是:不同浏览器返回结果不同 JS中 [] == ![]结果为true,而 {} == !{}却为false, 追根刨底 —— 一道 JavaScript 面试题 |
- 在 JavaScript中, Function 和 var 都会被提升(变量提升)
四、原型&继承
| 题号 | 通过 | 知识点 |
|---|---|---|
| 1 | √ | 再看一遍 |
| 2 | ❌❌ | 前端面试:经典面试题Foo与getName() |
| 3 | ❌❌ | |
| 4 | √ | |
| 5 | √ | 再看一遍 |
| 6 | √ |