面试复盘|贝壳面试
一面
- 自我介绍
- HTML行内、块级元素都有哪些
-
行内元素有:a b span img input select strong;
-
块级元素有:div ul ol li dl dt dd h1 h2 h3 h4 h5 h6 p;
-
- CSS盒模型:盒模型都是由四个部分组成的,分别是margin、border、padding和content。
-
标准盒模型和IE盒模型的区别在于设置width和height时,所对应的范围不同
-
标准盒模型的width和height属性的范围只包含了content,
-
IE盒模型的width和height属性的范围包含了border、padding和content。
-
-
修改元素的box-sizing属性来改变元素的盒模型:
-
box-sizeing: content-box表示标准盒模型(默认值)
-
box-sizeing: border-box表示IE盒模型(怪异盒模型)
-
-
- CSS可继承属性与不可继承属性有哪些
-
无继承的属性:
-
display:规定元素应该生成的框的类型
-
文本属性:
-
vertical-align:垂直文本对齐
-
text-decoration:规定添加到文本的装饰
-
text-shadow:文本阴影效果
-
white-space:空白符的处理
-
unicode-bidi:设置文本的方向
-
-
盒子模型的属性:width、height、margin、border、padding
-
背景属性:background、background-color、background-image、background-repeat、background-position、background-attachment
-
定位属性:float、clear、position、top、right、bottom、left、min-width、min-height、max-width、max-height、overflow、clip、z-index
-
生成内容属性:content、counter-reset、counter-increment
-
轮廓样式属性:outline-style、outline-width、outline-color、outline
-
页面样式属性:size、page-break-before、page-break-after
-
声音样式属性:pause-before、pause-after、pause、cue-before、cue-after、cue、play-during
-
-
有继承的属性:
-
字体系列属性
-
font-family:字体系列
-
font-weight:字体的粗细
-
font-size:字体的大小
-
font-style:字体的风格
-
-
文本系列属性
-
text-indent:文本缩进
-
text-align:文本水平对齐
-
line-height:行高
-
word-spacing:单词之间的间距
-
letter-spacing:中文或者字母之间的间距
-
text-transform:控制文本大小写(就是uppercase、lowercase、capitalize这三个)
-
color:文本颜色
-
-
元素可见性
-
visibility:控制元素显示隐藏
-
-
列表布局属性
-
list-style:列表风格,包括list-style-type、list-style-image等
-
-
光标属性
- cursor:光标显示为何种形态
-
-
-
- 水平垂直居中的实现
-
利用绝对定位,先将元素的左上角通过top:50%和left:50%定位到页面的中心,然后再通过translate来调整元素的中心点到页面的中心
.parent { position: relative; } .child { position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); }
-
利用绝对定位,设置四个方向的值都为0,并将margin设置为auto,由于宽高固定,因此对应方向实现平分,可以实现水平和垂直方向上的居中。
.parent { position: relative; } .child { position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin: auto; }
-
利用绝对定位,先将元素的左上角通过top:50%和left:50%定位到页面的中心,然后再通过margin负值来调整元素的中心点到页面的中心。
.parent { position: relative; } .child { position: absolute; top: 50%; left: 50%; margin-top: -50px; /* 自身 height 的一半 */ margin-left: -50px; /* 自身 width 的一半 */ }
-
使用flex布局,通过align-items:center和justify-content:center设置容器的垂直和水平方向上为居中对齐,然后它的子元素也可以实现垂直和水平的居中。
.parent { display: flex; justify-content:center; align-items:center; }
-
- 闭包的理解、应用:在 JavaScript 中,根据词法作用域的规则,内部函数总是可以访问其外部函数中声明的变量,当通过调用一个外部函数返回一个内部函数后,即使该外部函数已经执行结束了,但是内部函数引用外部函数的变量依然保存在内存中,我们就把这些变量的集合称为闭包。
-
封闭作用域: 全局变量私有化, 不会污染全局空间, 内部所有的临时变量执行完毕都会释放不占内存空间, 可以保存全局数据, 更新复杂变量.
-
作用域链: 封装全局变量, 把一些不需要暴露在全局的变量封装成"私有变量".
- 高级排他: 通过使用闭包, 将i变为局部变量. 如果不适用闭包, 所有的i都是同步变掉的
- 参数传递: 函数内部返回函数
- 函数节流: 封装节流函数
-
- HTTP状态码304什么意思?讲一下HTTP缓存
- 浏览器缓存相关。该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304 状态码返回时,不包含任何响应的主体部分。
-
浏览器缓存分为强缓存和协商缓存, 浏览器加载一个页面的简单流程如下 :
-
浏览器第一次加载资源,服务器返回 200,浏览器从服务器下载资源文件,并缓存资源文件与 response header,以供下次加载时对比使用;
-
下一次加载资源时,由于强制缓存优先级较高,先比较当前时间与上一次返回 200 时的时间差,如果没有超过 cache-control 设置的 max-age,则没有过期,并命中强缓存,直接从本地读取资源。如果浏览器不支持HTTP1.1,则使用 expires 头判断是否过期。如果命中则直接加载缓存中的资源, 并不会将请求发送到服务器. (强缓存)
-
如果资源已过期,则表明强制缓存没有被命中,则开始协商缓存,向服务器发送带有 If-None-Match 和 If-Modified-Since 的请求;
-
服务器收到请求后,优先根据 Etag 的值判断被请求的文件有没有做修改,Etag 值一致则没有修改,命中协商缓存,返回 304;如果不一致则有改动,直接返回新的资源文件带上新的 Etag 值并返回 200;
-
如果服务器收到的请求没有 Etag 值,则将 If-Modified-Since 和被请求文件的最后修改时间做比对,一致则命中协商缓存,返回 304;不一致则返回新的 last-modified 和文件并返回 200;
-
如果未命中协商缓存, 则服务器会将完整的资源返回给浏览器, 浏览器加载新资源, 并更新缓存. (新的请求)
-
-
- 算法
-
归并排序
- 反转链表
-
二面
- 自我介绍
- 聊项目(如何做前后端交互、为什么不采用服务器渲染、前后端分离的好处...)
-
C#、Django、Node的区别?
- 为什么采用Node做服务器,Node的优势是什么
- 如何做前后端交互
- 前后端分离的好处
- Node事件循环和浏览器事件循环
- 为什么用Vue不用React
-
- Vue双向数据绑定原理:Vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。
- Vue2中数组的响应式原理:改写七个方法,以Array.prototype为原型,创建了一个arrayMethods对象,并且用es6的Object.setPrototypeOf方法,让数组的proto指向了arrayMethods,就可以调用新定义的七个函数方法。
- 从输入URL到页面展示的全过程
- 平时怎么学习?如何学习前端?关注过哪些社区?
HR面
- 自我介绍
- 三个词形容一下自己
- 为什么选择前端
- 在做过的项目中的角色是什么
- 如何分配团队成员之间的工作
- 遇到问题如何解决
- 职业规划
- 对贝壳有哪些了解
- 什么时候可以入职
总结提问:
-
用户输入URL,浏览器会根据用户输入的信息判断是搜索还是网址,如果是搜索内容,就将搜索内容+默认搜索引擎合成新的URL;如果用户输入的内容符合URL规则,浏览器就会根据URL协议,在这段内容上加上协议合成合法的URL
-
用户输入完内容,按下回车键,浏览器导航栏显示loading状态,但是页面还是呈现前一个页面,这是因为新页面的响应数据还没有获得
-
浏览器进程浏览器构建请求行信息,会通过进程间通信(IPC)将URL请求发送给网络进程 GET /index.html HTTP1.1
-
网络进程获取到URL,先去本地缓存中查找是否有缓存文件,如果有,拦截请求,直接200返回;否则,进入网络请求过程
-
网络进程请求DNS返回域名对应的IP和端口号,DNS协议会依次从浏览器缓存、操作系统DNS缓存、本地DNS即host文件、非权威域名服务器、根域名服务器、顶级域名服务器、二级域名服务器、权威域名服务器层层解析,如果之前DNS数据缓存服务缓存过当前域名信息,就会直接返回缓存信息;否则,发起请求获取根据域名解析出来的IP和端口号,如果没有端口号,http默认80,https默认443。如果是https请求,还需要建立TLS连接。
-
Chrome 有个机制,同一个域名同时最多只能建立 6 个TCP 连接,如果在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成。如果当前请求数量少于6个,会直接建立TCP连接。
-
TCP三次握手建立连接,http请求加上TCP头部——包括源端口号、目的程序端口号和用于校验数据完整性的序号,向下传输
-
网络层在数据包上加上IP头部——包括源IP地址和目的IP地址,继续向下传输到底层
-
底层通过物理网络传输给目的服务器主机
-
目的服务器主机网络层接收到数据包,解析出IP头部,识别出数据部分,将解开的数据包向上传输到传输层
-
目的服务器主机传输层获取到数据包,解析出TCP头部,识别端口,将解开的数据包向上传输到应用层
-
应用层HTTP解析请求头和请求体,如果需要重定向,HTTP直接返回HTTP响应数据的状态code301或者302,同时在请求头的Location字段中附上重定向地址,浏览器会根据code和Location进行重定向操作;如果不是重定向,首先服务器会根据 请求头中的If-None-Match 的值来判断请求的资源是否被更新,如果没有更新,就返回304状态码,相当于告诉浏览器之前的缓存还可以使用,就不返回新数据了;否则,返回新数据,200的状态码,并且如果想要浏览器缓存数据的话,就在相应头中加入字段: Cache-Control:Max-age=2000 响应数据又顺着应用层——传输层——网络层——网络层——传输层——应用层的顺序返回到网络进程
-
数据传输完成,TCP四次挥手断开连接。如果,浏览器或者服务器在HTTP头部加上如下信息,TCP就一直保持连接。保持TCP连接可以省下下次需要建立连接的时间,提示资源加载速度Connection:Keep-Alive
-
网络进程将获取到的数据包进行解析,根据响应头中的Content-type来判断响应数据的类型,如果是字节流类型,就将该请求交给下载管理器,该导航流程结束,不再进行;如果是text/html类型,就通知浏览器进程获取到文档准备渲染
-
浏览器进程获取到通知,根据当前页面B是否是从页面A打开的并且和页面A是否是同一个站点(根域名和协议一样就被认为是同一个站点),如果满足上述条件,就复用之前网页的进程,否则,新创建一个单独的渲染进程
-
浏览器会发出“提交文档”的消息给渲染进程,渲染进程收到消息后,会和网络进程建立传输数据的“管道”,文档数据传输完成后,渲染进程会返回“确认提交”的消息给浏览器进程
-
浏览器收到“确认提交”的消息后,会更新浏览器的页面状态,包括了安全状态、地址栏的 URL、前进后退的历史状态,并更新web页面,此时的web页面是空白页
-
渲染进程对文档进行页面解析和子资源加载。HTML 通过HTM 解析器转成DOM Tree(二叉树类似结构的东西),CSS按照CSS 规则和CSS解释器转成CSSOM TREE,两个tree结合,形成render tree(不包含HTML的具体元素和元素要画的具***置),通过Layout可以计算出每个元素具体的宽高颜色位置,结合起来,开始绘制,最后显示在屏幕中新页面显示出来
-
渲染进程将 HTML 内容转换为能够读懂的 DOM 树 结构。
-
渲染引擎将 CSS 样式表转化为浏览器可以理解的 styleSheets,计算出 DOM 节点的样式。
-
创建布局树,并计算元素的布局信息。
-
对布局树进行分层,并生成分层树。
-
为每个图层生成绘制列表,并将其提交到合成线程。
-
合成线程将图层分成图块,并在光栅化线程池中将图块转换成位图。
-
合成线程发送绘制图块命令 DrawQuad 给浏览器进程。
-
浏览器进程根据 DrawQuad 消息生成页面,并显示到显示器上。
-