31、 浏览器输入url会,发生了什么?
执行顺序
- URL解析
- DNS 解析:缓存判断 + 查询IP地址
- TCP 连接:TCP 三次握手(建立连接)
- SSL/TLS四次握手(只有https才有这一步)
- 浏览器发送请求
- 服务器响应请求并返回数据
- 浏览器解析渲染页面
- 断开连接:TCP 四次挥手
1、URL解析
浏览器先会判断输入的字符是不是一个合法的URL结构,如果不是,浏览器会使用搜索引擎对这个字符串进行搜索
2、DNS解析
DNS解析实际上就是寻找你所需要的资源的过程。例如:输入www.google.com
网址后,首先在本地的域名服务器中查找,没找到去根域名服务器查找,没有再去com
顶级域名服务器查找,如此的类推下去,直到找到IP地址,然后把它记录在本地,供下次使用。 大致过程就是.
-> .com -> google.com.
-> www.google.com.
。 (你可能觉得我多写 .,并木有,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求DNS的时候会自动加上)
3、TCP 连接
TCP提供一种可靠的传输,这个过程涉及到三次握手,四次挥手。
第一次握手:
客户端发送syn包(Seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(Seq=y),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:
客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
4、浏览器发送请求
发送HTTP请求的过程就是构建HTTP请求报文并通过TCP协议中发送到服务器指定端口 请求报文由请求行 ,请求抱头 ,请求正文组成。
5、服务器响应请求并返回数据
对TCP连接进行处理,对HTTP协议进行解析,并按照报文格式进一步封装成HTTP Request对象,返回数据。
6、浏览器解析渲染页面
浏览器反复进行回流
和重绘
,将数据渲染到页面。
7、断开连接
数据传输完毕后,双方都可释放连接。
32、 Promise.all、Promise.race、Promise.any的区别
all: 成功的时候返回的是一个结果数组
,而失败的时候则返回最先被reject失败状态的值
。
race: 哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。
any: 返回最快的成功结果,如果全部失败就返回失败结果。
async/await语法
await 等待的是一个表达式
,而不仅仅用于等 Promise 对象
,它可以等任意表达式的结果,所以await 后面实际是可以接普通函数调用或者直接量的。
await 表达式的运算结果取决于它等的是什么。
- 如果它等到的不是一个 Promise 对象,那 await 表达式的运算结果就是它等到的东西。
- 如果它等到的是一个 Promise 对象,await 就忙起来了,它会阻塞后面的代码,等着 Promise 对象 resolve,然后得到 resolve 的值,作为 await 表达式的运算结果。
await 表达式 必须在异步函数中运行,即用async,将函数变成异步的。
注意:如果await
命令后面的Promise
对象,最好把await
命令放在try...catch
代码块中,因为 Promise的错误不会暴露在外面,所以用try...catch
捕获异常。
33、 了解ES6的Set,WeakSet,Map和WeakMap吗?
Set
Set
本身是一个构造函数,用来生成 Set
数据结构。Set
函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化。Set
对象允许存储任何类型的值,无论是原始值或者是对象引用。它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set
对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
- +0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复
undefined
与undefined
是恒等的,所以不重复NaN
与NaN
是不恒等的,但是在Set
中认为NaN
与NaN
相等,所有只能存在一个,不重复。
weakSet
WeakSet
结构与 Set
类似,也是不重复的值的集合。
- 成员都是数组和类似数组的对象,若调用
add()
方法时传入了非数组和类似数组的对象的参数,就会抛出错误。
scss
复制代码
const b = [1, 2, [1, 2]]
new WeakSet(b) // Uncaught TypeError: Invalid value used in weak set
- 成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏。
WeakSet
不可迭代,因此不能被用在for-of
等循环中。WeakSet
没有size
属性。
Map
ap
中存储的是 key-value
形式的键值对, 其中的 key
和 value
可以是任何类型的, 即对象也可以作为 key
。 Map
的出现,就是让各种类型的值都可以当作键。
WeakMap
WeakMap
结构与 Map
结构类似,也是用于生成键值对的集合。
- 只接受对象作为键名(
null
除外),不接受其他类型的值作为键名 - 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
- 不能遍历,方法有
get
、set
、has
、delete
34、 观察者模式与发布订阅模式的区别
观察者模式
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新
观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯
例如在掘金中,你关注了一位博主,这位博主每次更新文章,你都会接收到提醒消息。有多人关注了博主,每个人都会收到消息,博主和关注者就形成了一对多的依赖关系。
发布订阅模式
发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者存在。
例如在掘金中,一位博主发布了文章,而博主不会知道有哪些读者会看到文章;读者想了解某类型知识,在掘金搜索相关文章,而不会知道有那些博主发布了这类型的文章。
35、 如何判断当前的Js代码是否在浏览器环境中运行
如果Javascript在浏览器环境中运行,则会有一个全局对象:window
。因此,可以通过以下方式判断环境:
js
typeof window.self !== "undefined";
// 在web worker或者sevice worker下是无法获取到windows全局变量, 所以需要通过self变量判断