
前端面试题
归纳总结前端的面试题
LuckXinXin
加油
展开
-
从浏览器地址栏输入url到显示页面的步骤--详细简版
从浏览器接收url到开启网络请求线程(这一部分可以展开浏览器的机制以及进程与线程之间的关系)开启网络线程到发出一个完整的HTTP请求(这一部分涉及到dns查询,TCP/IP请求,五层因特网协议栈等知识)从服务器接收到请求到对应后台接收到请求(这一部分可能涉及到负载均衡,安全拦截以及后台内部的处理等等)后台和前台的HTTP交互(这一部分包括HTTP头部、响应码、报文结构、cookie等知识,可以提下静态资源的cookie优化,以及编码解码,如gzip压缩等)单独拎出来的缓存问题,HTTP的缓存(这部.原创 2021-01-10 16:06:15 · 147 阅读 · 0 评论 -
从浏览器地址栏输入url到显示页面的步骤--详细版
在浏览器地址栏输入URL浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤如果资源未缓存,发起新请求如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证。检验新鲜通常有两个HTTP头进行控制Expires和Cache-Control:HTTP1.0提供Expires,值为一个绝对时间表示缓存新鲜日期HTTP1.1增加了Cache-Control: max-age=,值为以秒为单位的最大新鲜时间浏览器解析URL获取协议,主机,端口,path浏览..原创 2021-01-10 16:03:48 · 186 阅读 · 0 评论 -
从浏览器地址栏输入url到显示页面的步骤--基础版本
浏览器根据请求的URL交给DNS域名解析,找到真实IP,向服务器发起请求;服务器交给后台处理完成后返回数据,浏览器接收文件(HTML、JS、CSS、图象等);浏览器对加载到的资源(HTML、JS、CSS等)进行语法解析,建立相应的内部数据结构(如HTML的DOM);载入解析到的资源文件,渲染页面,完成。...原创 2021-01-10 15:48:36 · 87 阅读 · 0 评论 -
前端技术常见数据结构相关问题--- 应用
选取了 LeetCode 上序号为 20 的题 题意是匹配括号,可以通过栈的特性来完成这道题目var isValid = function (s) { let map = { '(': -1, ')': 1, '[': -2, ']': 2, '{': -3, '}': 3 } let stack = [] for (let i = 0; i < s.length; i++) { if (map[s[i]] < 0) .原创 2021-01-08 21:26:16 · 95 阅读 · 0 评论 -
前端技术常见数据结构相关问题--- 栈
概念栈是一个线性结构,在计算机中是一个相当常见的数据结构。栈的特点是只能在某一端添加或删除数据,遵循先进后出的原则实现每种数据结构都可以用很多种方式来实现,其实可以把栈看成是数组的一个子集,所以这里使用数组来实现.class Stack { constructor() { this.stack = [] } push(item) { this.stack.push(item) } pop() { this.stack.pop() } p原创 2021-01-08 21:26:03 · 134 阅读 · 0 评论 -
前端技术常见数据结构相关问题--- 时间复杂度
在进入正题之前,我们先来了解下什么是时间复杂度。通常使用最差的时间复杂度来衡量一个算法的好坏。常数时间 O(1) 代表这个操作和数据量没关系,是一个固定时间的操作,比如说四则运算。对于一个算法来说,可能会计算出操作次数为 aN + 1,N 代表数据量。那么该算法的时间复杂度就是 O(N)。因为我们在计算时间复杂度的时候,数据量通常是非常大的,这时候低阶项和常数项可以忽略不计。当然可能会出现两个算法都是 O(N) 的时间复杂度,那么对比两个算法的好坏就要通过对比低阶项和常数项了...原创 2020-12-26 14:35:40 · 117 阅读 · 0 评论 -
前端技术设计模式相关问题--- 外观模式
外观模式提供了一个接口,隐藏了内部的逻辑,更加方便外部调用。个例子来说,我们现在需要实现一个兼容多种浏览器的添加事件方法function addEvent(elm, evType, fn, useCapture) { if (elm.addEventListener) { elm.addEventListener(evType, fn, useCapture) return true } else if (elm.attachEvent) { var r = elm..原创 2020-12-26 14:35:33 · 103 阅读 · 0 评论 -
前端技术设计模式相关问题--- 发布-订阅模式
发布-订阅模式也叫做观察者模式。通过一对一或者一对多的依赖关系,当对象发生改变时,订阅方都会收到通知。在现实生活中,也有很多类似场景,比如我需要在购物网站上购买一个产品,但是发现该产品目前处于缺货状态,这时候我可以点击有货通知的按钮,让网站在产品有货的时候通过短信通知我。在实际代码中其实发布-订阅模式也很常见,比如我们点击一个按钮触发了点击事件就是使用了该模式<ul id="ul"></ul><script> let ul = document.quer.原创 2020-12-26 14:35:23 · 131 阅读 · 0 评论 -
前端技术设计模式相关问题--- 代理模式
代理是为了控制对对象的访问,不让外部直接访问到对象。在现实生活中,也有很多代理的场景。比如你需要买一件国外的产品,这时候你可以通过代购来购买产品。在实际代码中其实代理的场景很多,也就不举框架中的例子了,比如事件代理就用到了代理模式<ul id="ul"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> <li.原创 2020-12-26 14:35:14 · 98 阅读 · 0 评论 -
前端技术设计模式相关问题--- 装饰模式
装饰模式不需要改变已有的接口,作用是给对象添加功能。就像我们经常需要给手机戴个保护套防摔一样,不改变手机自身,给手机添加了保护套提供防摔功能。以下是如何实现装饰模式的例子,使用了 ES7 中的装饰器语法function readonly(target, key, descriptor) { descriptor.writable = false return descriptor}class Test { @readonly name = 'yck'}let t = ne.原创 2020-12-22 19:56:49 · 101 阅读 · 0 评论 -
前端技术设计模式相关问题--- 适配器模式
适配器用来解决两个接口不兼容的情况,不需要改变已有的接口,通过包装一层的方式实现两个接口的正常协作。以下是如何实现适配器模式的例子class Plug { getName() { return '港版插头' }}class Target { constructor() { this.plug = new Plug() } getName() { return this.plug.getName() + ' 适配器转二脚插头' }}let t.原创 2020-12-22 19:56:39 · 176 阅读 · 0 评论 -
前端技术设计模式相关问题--- 单例模式
单例模式很常用,比如全局缓存、全局状态管理等等这些只需要一个对象,就可以使用单例模式。单例模式的核心就是保证全局只有一个对象可以访问。因为 JS 是门无类的语言,所以别的语言实现单例的方式并不能套入 JS 中,我们只需要用一个变量确保实例只创建一次就行,以下是如何实现单例模式的例子class Singleton { constructor() {}}Singleton.getInstance = (function() { let instance return function(.原创 2020-12-22 19:56:31 · 89 阅读 · 0 评论 -
前端技术设计模式相关问题--- 工厂模式
工厂模式分为好几种,这里就不一一讲解了,以下是一个简单工厂模式的例子class Man { constructor(name) { this.name = name } alertName() { alert(this.name) }}class Factory { static create(name) { return new Man(name) }}Factory.create('yck').alertName()当然工厂模式并.原创 2020-12-22 19:56:14 · 143 阅读 · 0 评论 -
前端技术 设计模式相关问题--- 设计模式
设计模式总的来说是一个抽象的概念,前人通过无数次的实践总结出的一套写代码的方式,通过这种方式写的代码可以让别人更加容易阅读、维护以及复用。原创 2020-12-22 19:56:02 · 71 阅读 · 0 评论 -
前端技术HTTP2.0相关问题--- HTTP/3
虽然 HTTP/2 解决了很多之前旧版本的问题,但是它还是存在一个巨大的问题,虽然这个问题并不是它本身造成的,而是底层支撑的 TCP 协议的问题。因为 HTTP/2 使用了多路复用,一般来说同一域名下只需要使用一个 TCP 连接。当这个连接中出现了丢包的情况,那就会导致 HTTP/2 的表现情况反倒不如 HTTP/1 了。因为在出现丢包的情况下,整个 TCP 都要开始等待重传,也就导致了后面的所有数据都被阻塞了。但是对于 HTTP/1 来说,可以开启多个 TCP 连接,出现这种情况反到只会影响其中一个.原创 2020-12-22 19:55:53 · 306 阅读 · 0 评论 -
前端技术HTTP2.0相关问题--- 服务端 Push
在 HTTP/2 中,服务端可以在客户端某个请求后,主动推送其他资源。可以想象以下情况,某些资源客户端是一定会请求的,这时就可以采取服务端 push 的技术,提前给客户端推送必要的资源,这样就可以相对减少一点延迟时间。当然在浏览器兼容的情况下你也可以使用 prefetch...原创 2020-12-22 19:55:45 · 263 阅读 · 0 评论 -
前端技术HTTP2.0相关问题--- Header 压缩
在 HTTP/1 中,我们使用文本的形式传输 header,在 header 携带 cookie 的情况下,可能每次都需要重复传输几百到几千的字节。在 HTTP / 2中,使用了 HPACK 压缩格式对传输的 header 进行编码,减少了 header 的大小。并在两端维护了索引表,用于记录出现过的 header ,后面在传输过程中就可以传输已经记录过的 header 的键名,对端收到数据后就可以通过键名找到对应的值。...原创 2020-12-22 19:55:37 · 406 阅读 · 0 评论 -
前端技术HTTP2.0相关问题--- 多路复用
在 HTTP/2 中,有两个非常重要的概念,分别是帧(frame)和流(stream)。帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。多路复用,就是在一个 TCP 连接中可以存在多条流。换句话说,也就是可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。...原创 2020-12-22 19:55:25 · 323 阅读 · 0 评论 -
前端技术HTTP2.0相关问题--- 二进制传输
HTTP/2 中所有加强性能的核心点在于此。在之前的 HTTP 版本中,我们是通过文本的方式传输数据。在 HTTP/2 中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码。原创 2020-12-22 19:55:17 · 282 阅读 · 0 评论 -
前端技术HTTP2.0相关问题--- HTTP/2
HTTP/2 相比于 HTTP/1,可以说是大幅度提高了网页的性能。在 HTTP/1 中,为了性能考虑,我们会引入雪碧图、将小图内联、使用多个域名等等的方式。这一切都是因为浏览器限制了同一个域名下的请求数量(Chrome 下一般是限制六个连接),当页面中需要请求很多资源的时候,队头阻塞(Head of line blocking)会导致在达到最大请求数量时,剩余的资源需要等待其他资源请求完成后才能发起请求。在 HTTP/2 中引入了多路复用的技术,这个技术可以只通过一个 TCP 连接就可以传输所有的请.原创 2020-12-22 19:55:08 · 295 阅读 · 0 评论 -
前端技术HTTP2.0相关问题---HTTP2.0
HTTP/2 很好的解决了当下最常用的 HTTP/1 所存在的一些性能问题,只需要升级到该协议就可以减少很多之前需要做的性能优化工作,当然兼容问题以及如何优雅降级应该是国内还不普遍使用的原因之一。虽然 HTTP/2 已经解决了很多问题,但是并不代表它已经是完美的了,HTTP/3 就是为了解决 HTTP/2 所存在的一些问题而被推出来的。...原创 2020-12-22 19:55:00 · 249 阅读 · 0 评论 -
前端技术HTTP/TLS相关问题---TLS
HTTPS 还是通过了 HTTP 来传输信息,但是信息通过 TLS 协议进行了加密。TLS 协议位于传输层之上,应用层之下。首次进行 TLS 协议传输需要两个 RTT ,接下来可以通过 Session Resumption 减少到一个 RTT。在 TLS 中使用了两种加密技术,分别为:对称加密和非对称加密。对称加密对称加密就是两边拥有相同的秘钥,两边都知道如何将密文加密解密。这种加密方式固然很好,但是问题就在于如何让双方知道秘钥。因为传输数据都是走的网络,如果将秘钥通过网络的方式传递的话,一.原创 2020-12-22 19:54:52 · 264 阅读 · 0 评论 -
前端技术HTTP/TLS相关问题---常见状态码
状态码表示了响应的一个状态,可以让我们清晰的了解到这一次请求是成功还是失败,如果失败的话,是什么原因导致的,当然状态码也是用于传达语义的。如果胡乱使用状态码,那么它存在的意义就没有了2XX 成功200 OK,表示从客户端发来的请求在服务器端被正确处理204 No content,表示请求成功,但响应报文不含实体的主体部分205 Reset Content,表示请求成功,但响应报文不含实体的主体部分,但是与 204 响应不同在于要求请求方重置内容206 Partial Content,进行范围.原创 2020-12-22 19:54:29 · 347 阅读 · 0 评论 -
前端技术HTTP/TLS相关问题---首部
首部分为请求首部和响应首部,并且部分首部两种通用,接下来我们就来学习一部分的常用首部。1.1 通用首部1.2 请求首部原创 2020-12-22 19:54:21 · 140 阅读 · 0 评论 -
前端技术HTTP/TLS相关问题---HTTP 请求中的内容
HTTP 请求由三部分构成,分别为:请求行首部实体请求行大概长这样 GET /images/logo.gif HTTP/1.1,基本由请求方法、URL、协议版本组成,这其中值得一说的就是请求方法了。请求方法分为很多种,最常用的也就是 Get 和 Post 了。虽然请求方法有很多,但是更多的是传达一个语义,而不是说 Post 能做的事情 Get 就不能做了。如果你愿意,都使用 Get 请求或者 Post 请求都是可以的常考面试题:Post 和 Get 的区别?首先先引入副作.原创 2020-12-22 19:54:10 · 109 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---拥塞处理
拥塞处理和流量控制不同,后者是作用于接收方,保证接收方来得及接受数据。而前者是作用于网络,防止过多的数据拥塞网络,避免出现网络负载过大的情况。拥塞处理包括了四个算法,分别为:慢开始,拥塞避免,快速重传,快速恢复慢开始算法慢开始算法,顾名思义,就是在传输开始时将发送窗口慢慢指数级扩大,从而避免一开始就传输大量数据导致网络拥塞。想必大家都下载过资源,每当我们开始下载的时候都会发现下载速度是慢慢提升的,而不是一蹴而就直接拉满带宽慢开始算法步骤具体如下连接初始设置拥塞窗口(Congestion .原创 2020-12-22 19:53:58 · 421 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---滑动窗口
上面小节中讲到了发送窗口。在 TCP 中,两端其实都维护着窗口:分别为发送端窗口和接收端窗口。发送端窗口包含已发送但未收到应答的数据和可以发送但是未发送的数据发送端窗口是由接收窗口剩余大小决定的。接收方会把当前接收窗口的剩余大小写入应答报文,发送端收到应答后根据该值和当前网络拥塞情况设置发送窗口的大小,所以发送窗口的大小是不断变化的。当发送端接收到应答报文后,会随之将窗口进行滑动滑动窗口是一个很重要的概念,它帮助 TCP 实现了流量控制的功能。接收方通过报文告知发送方还可以发送多少数据,从而保.原创 2020-12-22 19:53:48 · 423 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---ARQ 协议
ARQ 协议也就是超时重传机制。通过确认和超时机制保证了数据的正确送达,ARQ 协议包含停止等待 ARQ 和连续 ARQ 两种协议。停止等待 ARQ正常传输过程只要 A 向 B 发送一段报文,都要停止发送并启动一个定时器,等待对端回应,在定时器时间内接收到对端应答就取消定时器并发送下一段报文。报文丢失或出错在报文传输的过程中可能会出现丢包。这时候超过定时器设定的时间就会再次发送丢失的数据直到对端响应,所以需要每次都备份发送的数据。即使报文正常的传输到对端,也可能出现在传输过程中报文出错.原创 2020-12-22 19:53:39 · 359 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---ARQ 协议
ARQ 协议也就是超时重传机制。通过确认和超时机制保证了数据的正确送达,ARQ 协议包含停止等待 ARQ 和连续 ARQ 两种协议。停止等待 ARQ正常传输过程只要 A 向 B 发送一段报文,都要停止发送并启动一个定时器,等待对端回应,在定时器时间内接收到对端应答就取消定时器并发送下一段报文。报文丢失或出错在报文传输的过程中可能会出现丢包。这时候超过定时器设定的时间就会再次发送丢失的数据直到对端响应,所以需要每次都备份发送的数据。即使报文正常的传输到对端,也可能出现在传输过程中报文.原创 2020-12-22 19:53:31 · 272 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---状态机
TCP 的状态机是很复杂的,并且与建立断开连接时的握手息息相关,接下来就来详细描述下两种握手在这之前需要了解一个重要的性能指标 RTT。该指标表示发送端发送数据到接收到对端数据所需的往返时间建立连接三次握手首先假设主动发起请求的一端称为客户端,被动连接的一端称为服务端。不管是客户端还是服务端,TCP 连接建立完后都能发送和接收数据,所以 TCP 是一个全双工的协议。起初,两端都为 CLOSED 状态。在通信开始前,双方都会创建 TCB。 服务器创建完 TCB 后便进入 LISTEN 状态,.原创 2020-12-13 19:10:31 · 390 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---TCP
常考面试题:UDP 与 TCP 的区别是什么?TCP 基本是和 UDP 反着来,建立连接断开连接都需要先需要进行握手。在传输数据的过程中,通过各种算法保证数据的可靠性,当然带来的问题就是相比 UDP 来说不那么的高效头部从这个图上我们就可以发现 TCP 头部比 UDP 头部复杂的多对于 TCP 头部来说,以下几个字段是很重要的Sequence number,这个序号保证了 TCP 传输的报文都是有序的,对端可以通过序号顺序的拼接报文Acknowledgement Number,.原创 2020-12-13 19:10:17 · 140 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---适合使用的场景
UDP虽然对比 TCP 有很多缺点,但是正是因为这些缺点造就了它高效的特性,在很多实时性要求高的地方都可以看到 UDP 的身影。直播想必大家都看过直播吧,大家可以考虑下如果直播使用了基于 TCP 的协议会发生什么事情?TCP 会严格控制传输的正确性,一旦有某一个数据对端没有收到,就会停止下来直到对端收到这个数据。这种问题在网络条件不错的情况下可能并不会发生什么事情,但是在网络情况差的时候就会变成画面卡住,然后再继续播放下一帧的情况。但是对于直播来说,用户肯定关注的是最新的画面,而不是因为网络条.原创 2020-12-13 19:10:03 · 243 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---传输方式
UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。原创 2020-12-13 19:09:33 · 390 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---高效
虽然 UDP 协议不是那么的可靠,但是正是因为它不是那么的可靠,所以也就没有 TCP 那么复杂了,需要保证数据不丢失且有序到达。因此 UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少得多,在传输数据报文时是很高效的。UDP 头部包含了以下几个数据两个十六位的端口号,分别为源端口(可选字段)和目标端口 整个数据报文的长度整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误...原创 2020-12-13 19:09:18 · 87 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---不可靠性
首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。再者网络环境时好时坏,但是 UDP 因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如电话会议)就需要使用 UDP 而不是 TCP...原创 2020-12-13 19:09:03 · 139 阅读 · 0 评论 -
前端技术TCP/UDP相关问题---面向无连接
首先UDP 是不需要和 TCP 一样在发送数据前进行三次握手建立连接的,想发数据就可以开始发送了。并且也只是数据报文的搬运工,不会对数据报文进行任何拆分和拼接操作。具体来说就是:在发送端,应用层将数据传递给传输层的 UDP 协议,UDP 只会给数据增加一个 UDP 头标识下是 UDP 协议,然后就传递给网络层了 在接收端,网络层将数据传递给传输层,UDP 只去除 IP 报文头就传递给应用层,不会任何拼接操作...原创 2020-12-13 19:08:34 · 109 阅读 · 0 评论 -
前端技术TCP/UDP相关问题
网络协议是每个前端工程师都必须要掌握的知识,我们将先来学习传输层中的两个协议:UDP 以及TCP。对于大部分工程师来说最常用的协议也就是这两个了,并且面试中经常会提问的也是关于这两个协议的区别常考面试题:UDP 与 TCP 的区别是什么?首先 UDP 协议是面向无连接的,也就是说不需要在正式传递数据之前先连接起双方。然后 UDP协议只是数据报文的搬运工,不保证有序且不丢失的传递到对端,并且UDP 协议也没有任何控制流量的算法,总的来说 UDP 相较于 TCP 更加的轻便...原创 2020-12-13 19:08:13 · 232 阅读 · 0 评论 -
监控---异常监控
对于异常监控来说,以下两种监控是必不可少的,分别是代码报错以及接口异常上报。对于代码运行错误,通常的办法是使用 window.onerror 拦截报错。该方法能拦截到大部分的详细报错信息,但是也有例外对于跨域的代码运行错误会显示 Script error. 对于这种情况我们需要给 script标签添加 crossorigin 属性对于某些浏览器可能不会显示调用栈信息,这种情况可以通过 arguments.callee.caller 来做栈递归对于异步代码来说,可以使用 catch 的方.原创 2020-12-13 19:07:52 · 524 阅读 · 0 评论 -
下面这段代码的运行结果是什么?
//number和boolean通过==判断相等的时候 //false相等于0,true相等于1 console.log(1 == true) //true console.log(0 == false); //true console.log(3 == true); //f...原创 2020-11-29 12:12:20 · 806 阅读 · 0 评论 -
[2,6,7]和[3,5,8] => [2,3,5,6,7,8]
var b;function a(){ var a = 'a'; B = function(){ return a + 'B'; } return a;} console.log(a()); //a console.log(B()); //aB1)先将两个数组进行拼接,然后在升序function sort(a,b){ var merge = a.concat(...原创 2020-11-29 12:11:42 · 80 阅读 · 0 评论