2020腾讯前端校招题目自己的理解
1. JS有哪些基本数据类型
基本数据类型:number string null undefined boolean
除此之外JS还有引用基本类型:Object Arr Function
这是JS的两种数据类型
2.setTimeout与setInterval的区别
这两个都是定时器,间隔一段事件后执行传入的函数
区别在于setTimeout只执行一次,setInterval间隔一定时间重复执行,需要clearInterval才能清除定时器
setTimeout(function(){
console.log("123");},1000);
setInterval(function(){
console.log("123");},1000);
3.setTimeout设置一个时间,那么一定是这个时间之后执行吗?
答案是否定的,不是
原因先不讲,我觉得再说这个之前应该要先讲一下JS的代码执行机制才能更好理解这个问题
4. JS的执行机制
JS是单线程执行任务,那么这里还有一个问题就是为什么JS是单线程执行,众所周知,多线程效率更高不是吗?
JS单线程执行,所有的任务如果放在主线程执行会造成任务阻塞,必须要等到上一个任务完成才能去执行后面的任务,所以采用了一个统一的标准,将一些费时的任务放到子线程去执行,于是就衍生出了两种任务,一种是同步任务一种是异步任务
同步任务就放到主线程执行,异步任务就不妨到主线程而放到子线程也就是任务队列(task queue),等待主线程执行完毕才去执行异步任务
于是就有了下面的执行机制:
()所有同步任务放到主线程
()主线程之外存在一个子线程受主线程控制,只要异步任务有了结果就在任务队列中放置一个事件
()主线程任务执行完毕就去自动读取任务队列中的事件,对应的异步任务结束等待状态进入执行栈开始执行
()不断重复上面过程,形成事件循环机制
5.那么JS为什么是单线程的呢?
举一个例子,如果JS是双线程工作,没错,效率肯定更高,但是如果对一个DOM节点进行操作
一个线程将DOM节点删除,一个线程将DOM节点添加进来,那么到底听谁的?
所以JavaScript本身就是一门浏览器脚本语言,是进行用户交互的,多线程会造成一些同步的复杂问题,所以使用主线程控制子线程的这种机制是最好的选择
6.宏任务和微任务
任务队列中又分为宏队列和微队列
宏队列:定时器都是,setTimeout setInterval,ajax回调,dom事件回调
微队列:promise回调函数
在主线程执行完毕之后,去执行任务队列中的任务,但是任务队列又分为宏队列和微队列,那么先执行哪个呢?
先执行宏队列但是每次执行宏队列都会去先检查微队列中的任务,如果有等待任务就先执行微队列的任务在执行宏队列的任务,
所以也可以说是先执行微队列的任务,所以promise的then()中回调函数总是先于setTimeout()执行
转到第3题
setTimeout不会再设定时间后执行的原因应该也很清晰了把,就是因为要等到主线程执行完毕才执行这个函数,所以并一定会再设定时间之后立即执行
7.pomise的几种状态
promise是有三种状态
pending:初始化状态
resolved也是fuliled状态:成功状态
rejected:失败状态
8.列举常用的数据结构
9.栈、队列、堆栈、堆是什么
10.promise实现原理
只是看到了一些同学的面经分享,添加一些自己的理解,持续更新
本文地址:https://blog.csdn.net/weixin_43797908/article/details/107879263