# 2020 / 3 / 19
内容出自「牛客网」 入口:https://www.nowcoder.com/discuss/294798?type=post&order=time&pos=&page=1
# 1 / event Loop 什么是宏任务,什么是微任务
在事件循环(EventLoop)中,每一次循环称为tick,每一次tick的任务如下
- 执行栈选择最先进入队列的宏任务MacroTask(通常是script),如果有则执行
- 检查是否存在微任务MicroTask,如果存在则不停的执行,直至情况microTask队列
- 更新render(每一次事件循环,浏览器都可能去更新渲染)
- 重复以上步骤
即宏任务 → 当前所有微任务 → 下一个宏任务
那么什么是宏任务,微任务呢?
异步任务可以分为两类,不同类型的api注册的任务会依次进入到各自对应的队列中,然后等待事件循环将它们依次压入执行栈
宏任务有哪些?
script、UI渲染、I/O、setTimeout、setInterval、setImmediate、requestAnimationFrame
微任务有哪些?
process.nextTick、Promise、MutationObserver
# 2 / www.baidu.com输入到浏览器到显示页面发生了什么?
- 输入url
- 浏览器依次查询'浏览器缓存','系统缓存','路由缓存',如果存在缓存,则直接显示页面
- 若本地无缓存,则递归查询DNS,解析域名获取Ip地址
- 根据Ip地址和默认端口(http-80,https-443),与服务器建立起Tcp连接(三次握手)
- 服务器处理请求返回结果
- 释放Tcp连接(四次挥手)
- 浏览器将得到的Html文本解析成dom树,与cssom树结合构建render树并渲染到页面上
# 3 / 摘要加密是什么? 运用场景
摘要加密是指在Https协议中,采用散列算法Hash来对CA证书进行计算,计算公开的明文信息的信息摘要,然后采用CA的私钥对信息摘要进行加密,产生密文
运用场景:处理具有隐私性的明文通信,数字签名,保证数据完整性
# 4 / 如何限制Person对象新增其他属性
- 修改Person对象的writable
- Object.freeze()
# 5 / position:absolute 参照什么定位
参照第一个position不为static的父元素
# 6 / 算法题
list = [['大份','中份','小份'],['微辣','重辣'],['微麻','中麻']] // 商家可能会自主增删调整各项配置
function compose () {
// code => ['大份+微辣+微麻','大份+重辣+微麻',……] 所有组合
}
compose(list)
1
2
3
4
5
2
3
4
5
function compose(list){
let len = list.length
let result = []
let tmpPath = []
let backTrack = (tmpPath) => {
if(tmpPath.length == len){
result.push(tmpPath)
return
}
for(let i = 0; i < len; i++){
for(let j = 0; j < list[i].length; j++){
if(!list[i].includes(tmpPath[i]) && tmpath.length == i){
tmpPath.push(list[i][j])
backTrack(tmpPath.slice())
tmpPath.pop()
}
}
}
}
backTrack(tmpPath)
return result
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 7 / 什么是包含块,如何创建包含块,BFC如何解决外边距重合?
BFC是一个独立的容器,决定了该容器中的内容应该如何进行定位,以及与其他容器之间的相互作用,在一个BFC中,内容的元素不会影响到外部的元素
触发BFC:
- float的值不为none
- overflow的值不为visible
- display的值为 table-cell, tabble-caption、inline-block
- position的值不为static
BFC如何解决外边距重合
两个相邻元素上下margin会重合,那么给其中一个元素添加父级,触发父级BFC,BFC内的元素不会影响到外部元素