# 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
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

# 7 / 什么是包含块,如何创建包含块,BFC如何解决外边距重合?

BFC是一个独立的容器,决定了该容器中的内容应该如何进行定位,以及与其他容器之间的相互作用,在一个BFC中,内容的元素不会影响到外部的元素

触发BFC:

  • float的值不为none
  • overflow的值不为visible
  • display的值为 table-cell, tabble-caption、inline-block
  • position的值不为static

BFC如何解决外边距重合

两个相邻元素上下margin会重合,那么给其中一个元素添加父级,触发父级BFC,BFC内的元素不会影响到外部元素