易忘,但常问的面试题(五)

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 在存储判断唯一性的时候是恒等的,所以不重复
  • undefinedundefined 是恒等的,所以不重复
  • NaNNaN 是不恒等的,但是在 Set 中认为 NaNNaN 相等,所有只能存在一个,不重复。

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 形式的键值对, 其中的 keyvalue 可以是任何类型的, 即对象也可以作为 keyMap 的出现,就是让各种类型的值都可以当作键。

WeakMap

WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合。

  • 只接受对象作为键名(null 除外),不接受其他类型的值作为键名
  • 键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
  • 不能遍历,方法有 getsethasdelete

34、 观察者模式与发布订阅模式的区别

观察者模式

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新

观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯

例如在掘金中,你关注了一位博主,这位博主每次更新文章,你都会接收到提醒消息。有多人关注了博主,每个人都会收到消息,博主和关注者就形成了一对多的依赖关系。

发布订阅模式

发布-订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者(如果有的话)可能存在。订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者存在。

例如在掘金中,一位博主发布了文章,而博主不会知道有哪些读者会看到文章;读者想了解某类型知识,在掘金搜索相关文章,而不会知道有那些博主发布了这类型的文章。

35、 如何判断当前的Js代码是否在浏览器环境中运行

如果Javascript在浏览器环境中运行,则会有一个全局对象:window。因此,可以通过以下方式判断环境:

js 复制代码
 typeof window.self !== "undefined";
 // 在web worker或者sevice worker下是无法获取到windows全局变量, 所以需要通过self变量判断
相关推荐
Lee_Yu_Fan几秒前
vue3 + vite + antdv 项目中自定义图标
前端·vue.js·svg图标
我不当帕鲁谁当帕鲁3 分钟前
arcgis for js点击聚合要素查询其包含的所有要素
前端·javascript·arcgis
六卿3 分钟前
1、Three.js开端准备环境
javascript·three.js·three
shawya_void11 分钟前
javaweb-day03-前端零碎
前端
灰色人生qwer29 分钟前
webpack 项目访问静态资源
前端·webpack·node.js
看到请催我学习34 分钟前
js判断空对象
开发语言·前端·javascript·json
六卿37 分钟前
2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素
javascript·three.js·three
沉默是金~1 小时前
Vue+Elementui el-tree树只能选择子节点并且支持检索
javascript·vue.js·elementui
0_11 小时前
让你的网页变的高大上:国际化Vue-i18n
前端·javascript·vue.js
谷隐凡二1 小时前
fiddler安卓雷电模拟器配置踩坑篇
前端·测试工具·fiddler