互联网变化的太快了,几乎每一年就会有新的东西出来,随着vue3和TypeScript的日渐成熟。很多公司都在升级使用,如果你不学习,时间久了就等着被淘汰吧!
下面是真实几个我在面试过程真实遇到的面试题,后续会持续更新,保持饥饿才能持续进步,也不失为一种让自己进步的方式(看到问题后先思考,答案在两题之后):
1.严格模式下,箭头函数和普通函数,this指向?和非严格模式有什么区别?
2.let和const除了在块作用域上,还有其它区别么?
第1问答案:严格模式,有点像规范你代码,如果你有写错,通过运行之后提示报错让你修改。它的有点像TypeScirpt的类型系统,但后者是在你写代码时就提示,而不是等到运行后报错才提示。严格模式即在html中的script标签内,js语句执行前加上‘use strict’。
2.let修饰的变量后续可修改,而const修改控制台则会报错。
3.浏览器中强缓存和协商缓存区别?实现原理?
4.https和http三次握手四次挥手过程分别是怎样的?为什么握手是三次,挥手是四次?
第3问答案:
强制缓存:即向浏览器缓存查找请求结果,并根据该结果的缓存规则来决定是否使用该缓存结果的过程。这里细分有三种情况
一是、浏览器缓存查找不到和缓存标识失效,这时则向服务器发起请求(跟第一次发起请求一致)
二是、存在该缓存结果和缓存标识,但是结果已经失效,强制缓存失效,则使用协商缓存
三是、存在该缓存结果和缓存标识,且该结果没有还没有失效,强制缓存生效,直接返回该结果。
在http1.0中使用expires字段控制资源过期时间,http1.1之后进一步使用cache-control来控制,且优先级高于expires
协商缓存:就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,分两种情况:
一是:协商缓存生效,返回304
二是:协商缓存成功,返回200和请求结果
第4问答案:
第一次握手:客户端发送syn(syn=x)包到服务器,并等待确认进入syn_sent
第二次握手:服务端确认syn包,确认成功后自己也发一个syn(ack=x+1)包,即变成syn+ack(ack=y)包,进入syn_recv状态
第三次握手:客户端接收到服务端的ack+syn包后,给服务器发ack包(ack=y+1),发送完毕后,进入establishied(tcp连接成功)状态,完成三次握手。
第一次挥手:
5.从输入url到浏览器出现页面,这一过程发生了什么?需要DNS域名解析?解析查询有用到哪几种方式?
6.重排和重绘的区别?(这个问题答案可以和浏览器渲染流程一起作答,引导面试官往这上面问,显得你基础知识扎实)
第6问答案:首先理解什么是重排和重绘,客户端获取到服务器资源后(包含js、html、css、png等),将其中的html解析渲染生成我们经常用到和听到的Dom tree,配合css生成CSS Dom tree两者组合生成render tree。此时浏览器已经知道各个节点的位置、层叠关系、样式,接着就开始绘制painting,最后展示display出来。当浏览器发现某个部分发生了点变化影响了布局(可以理解为js改变了dom,或者在vue-cli脚手架中更新了dom),需要倒回去重新渲染,内行称这个回退的过程叫 reflow。reflow 会从 <html> 这个 root frame 开始递归往下,依次计算所有的结点几何尺寸和位置。reflow 几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显 示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲 染。通常我们都无法预估浏览器到底会 reflow 哪一部分的代码,它们都彼此相互影响着。repaint(重绘):改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性时,屏幕的一部分要重画,但是元素的几何尺寸没有变。
注意:(1)display:none 的节点不会被加入Render Tree,而visibility: hidden 则会,所以,如果某个节点最开始是不显示的,设为display:none是更优的。
(2)display:none 会触发 reflow,而 visibility:hidden 只会触发 repaint,因为没有发现位置变化。
(3)有些情况下,比如修改了元素的样式,浏览器并不会立刻reflow 或 repaint 一次,而是会把这样的操作积攒一批,然后做一次 reflow,这又叫异步 reflow 或增量异步 reflow。但是在有些情况下,比如resize 窗口,改变了页面默认的字体等。对于这些操作,浏览器会马上进行 reflow。
7.虚拟节点vnode更新过程?diff算法实现原理是怎样的?vnode节点比对方式哪几种?
8.computed和watch的区别?以及computed需要根据一个变量a计算另一个变量b,那怎样知道a的变化的?
第7问答案:vnode节点比对方式有深度优先遍历和广度优先遍历
9.宏任务和微任务的区别?有哪些是宏任务?哪些是微任务?
10.Promise和async await的区别?async await相对Promise好用在哪里?
11.垃圾回收过程?
12.vue2和vue3的区别?
13.谈谈你对this对象的理解?
14.javascript的数据类型?
15.webpack热更新原理?
16.js动画和css动画的区别?
17.websocket的实现与应用?
18.<link>和<import>的区别?
19.transition和animation的区别?
20.js的new 操作符做了哪些事情?
21.异步加载js的方法?
22.Ajax解决浏览器缓存问题
23.Babel原理?将ES6语法转ES5,对不兼容ES6的浏览器进行兼容