ES6面试题
794字约3分钟
2024-07-09
一、var、let、const的区别
var存在变量提升的情况,就是js预解析出现的问题,当声明再全局作用域下,var 声明的变量是挂在window上的 let是es6新增的特性,可以解决暂时性死区的问题,在一个括号下,let会形成一个块级作用域,所以日常中let用的多一点 const 是声明常量,定义了之后就不能改变,但是能改变堆中的内容,我们一般用于声明常量或者声明函数
二、es6新增特性
- 拓展运算符 ...
- 解构赋值
- const let
- 新增两种类型 map和set
- 数组方法 fill from includes等
- for...in 遍历对象和继承的属性,Object.keys()
- 对象新增方法,Object.assign、
- 函数的参数允许默认值
- 箭头函数
三、Set、Map使用和应用场景
Set是用于保存唯一值 Map用于像对象一样保存内容,他允许所有内容当作key Set方法:add、delete、has、clear Map方法:size、set、get、has、delete、clear
四、Promise相关
- Promise 的三种状态 pending、fufuilled 、 reject
- Promise原理:
- promise是基于发布订阅是方法实现的
- 首先执行promise传入的回调函数
- 这里会出现同步或者异步的问题,如果是同步就会立即执行resolve、reject如果是异步,那么一定不会立即执行resolve和reject
- 执行then中的内容,判断promise的状态,如果已经改变了那么肯定为同步状态,就立即执行then中的结果,我们这里使用
setTimeout(()=>{},0)
如果状态还没有被改变,就将then中的函数放到异步队列中,有一个成功的队列,失败的队列 - 异步执行,调用resolve和reject,resolve和reject由我们定义,用于改变状态,然后将队列中的内容都拿出来,都执行一次 这里需要解决三个问题 第一个是穿透问题,就是then中如果没有成功或者失败函数,就return 结果 第二个是链式调用的问题,我们这里是解决方式是也返回一个promise, 第三个是微任务和宏任务的问题,使用是
quequeMicrotask(()=>{})
将微任务添加到微任务队列中
- promise的其他方法
- then 执行成功或者失败的回调
- catch 用于捕获失败的执行回调
- finally 无论成功还是失败都会执行
- all 都成功才会调用res , 只要一个失败就走 err
- race 赛跑机制,只要有一个成功就执行成功,只要有一个失败就失败
五、实现发布订阅
发布订阅原理是当订阅的时候将内容存放到容器中,发布阶段就将内容函数拿出来执行。
- 需要定义一个容器用于存储on方法的回调函数,on方法将回调函数按照key、value(数组)的形式将函数存放在容器中
- 需要emit方法就是找出数组中相对应的key,拿出来执行即可