前端20个真正灵魂拷问,吃透这些你就是中级前端工程师 【上篇】

clipboard.png

网上参差不弃的面试题,本文由浅入深,让你在作面试官的时候,可以辨别出面试者是否是真的有点东西,也能让你去面试中级前端工程师更有底气。可是切记把背诵面试题当成了你的惟一求职方向

另外欢迎你们加入咱们的前端交流二群~,里面不少小姐姐哦,下篇将是很是硬核的源码,原理,本身编写框架和库等,若是感受写得不错,能够关注给个starjavascript

clipboard.png

越是开放性的题目,更能体现回答者的水平,一场好的面试,不只能发现面试者的不足,也能找到他的闪光点,还能提高面试官自身的技术html

1.CssHtml合并在第一个题目,请简述你让一个元素在窗口中消失以及垂直水平居中的方法,还有Flex布局的理解

标准答案:百度上固然不少,这里不作阐述,好的回答思路是:前端

  • 元素消失的方案先列出来, display:nonevisibility: hidden;的区别,拓展到vue框架的v-ifv-show的区别,能够搭配回流和重绘来说解

回流必将引发重绘,重绘不必定会引发回流

回流(Reflow):

Render Tree中部分或所有元素的尺寸、结构、或某些属性发生改变时,浏览器从新渲染部分或所有文档的过程称为回流
  • 下面内容会致使回流:vue

    • 页面首次渲染
    • 浏览器窗口大小发生改变
    • 元素尺寸或位置发生改变
    • 元素内容变化(文字数量或图片大小等等)
    • 元素字体大小变化
    • 添加或者删除可见的DOM元素
    • 激活CSS伪类(例如::hover)
    • 查询某些属性或调用某些方法
  • 一些经常使用且会致使回流的属性和方法:java

    • clientWidth、clientHeight、clientTop、clientLeft
    • offsetWidth、offsetHeight、offsetTop、offsetLeft
    • scrollWidth、scrollHeight、scrollTop、scrollLeft
    • scrollIntoView()、scrollIntoViewIfNeeded()
    • getComputedStyle()
    • getBoundingClientRect()
    • scrollTo()

重绘

当页面中元素样式的改变并不影响它在文档流中的位置时(例如:color、background-color、visibility等),浏览器会将新样式赋予给元素并从新绘制它,这个过程称为重绘。

性能影响对比:

clipboard.png

原文出处,感谢做者web

  • 列出元素垂直居中的方案,以及各类方案的缺陷

16种居中方案,感谢做者面试

  • 讲出flex经常使用的场景,以及flex 1作了什么

阮一峰老师的Flex布局算法

上面的问题若是答得很是好,在重绘和回流这块要下大功夫。这点是前端性能优化的基础,而性能优化是前端最重要的核心基础技能点,也是面试官最看中的基础之一

2.你对This了解吗,有本身实现过call,apply,bind吗?

50行javaScript代码实现call,apply,bind编程

这是一个很基础的技能点,考察你对闭包,函数调用的理解程度,我感受我写得比较简单容易懂segmentfault

3.如何减小重绘和回流的次数:

clipboard.png

4.你对前端的异步编程有哪些了解呢

这个题目若是回答很是完美,那么能够判断这我的已经脱离了初级前端工程师,前端的核心就是异步编程,这个题目也是体现前端工程师基础是否扎实的最重要依据。

仍是老规矩,从易到难吧

传统的定时器,异步编程:

setTimeout(),setInterval()等。

缺点:当同步的代码比较多的时候,不肯定异步定时器的任务时候能在指定的时间执行。

例如:

在第100行执行代码 setTimeout(()=>{console.log(1)},1000)//1s后执行里面函数

可是后面可能有10000行代码+不少计算的任务,例如循环遍历,那么1s后就没法输出console.log(1)

可能要到2s甚至更久

setInterval跟上面同理 当同步代码比较多时,不确保每次能在同样的间隔执行代码,

若是是动画,那么可能会掉帧

ES6的异步编程:

promise generator async
new promise((resolve,reject)=>{ resolve() }).then()....
 缺点: 仍然没有摆脱回掉函数,虽然改善了回掉地狱
 
 generator函数 调用next()执行到下一个yeild的代码内容,若是传入参数则做为上一个

`yield`的
返回值
 缺点:不够自动化

 async await 
 只有async函数内部能够用await,将异步代码变成同步书写,可是因为async函数自己返回一个
promise,也很容易产生async嵌套地狱

requestAnimationFramerequestIdleCallback

传统的 javascript 动画是经过定时器 setTimeout 或者 setInterval 实现的。可是定时器动画一直存在两个问题

第一个就是动画的循时间环间隔很差肯定,设置长了动画显得不够平滑流畅,设置短了浏览器的重绘频率会达到瓶颈,推荐的最佳循环间隔是17ms(大多数电脑的显示器刷新频率是60Hz,1000ms/60);

第二个问题是定时器第二个时间参数只是指定了多久后将动画任务添加到浏览器的UI线程队列中,若是UI线程处于忙碌状态,那么动画不会马上执行。为了解决这些问题,H5 中加入了 requestAnimationFrame以及requestIdleCallback

requestAnimationFrame 会把每一帧中的全部 DOM 操做集中起来,在一次重绘或回流中就完成,而且重绘或回流的时间间隔牢牢跟随浏览器的刷新频率

在隐藏或不可见的元素中,requestAnimationFrame 将不会进行重绘或回流,这固然就意味着更少的 CPU、GPU 和内存使用量

requestAnimationFrame 是由浏览器专门为动画提供的 API,在运行时浏览器会自动优化方法的调用,而且若是页面不是激活状态下的话,动画会自动暂停,有效节省了 CPU 开销

性能对比:

clipboard.png

requestAnimationFrame的回调会在每一帧肯定执行,属于高优先级任务,而requestIdleCallback的回调则不必定,属于低优先级任务。

咱们所看到的网页,都是浏览器一帧一帧绘制出来的,一般认为FPS为60的时候是比较流畅的,而FPS为个位数的时候就属于用户能够感知到的卡顿了,那么在一帧里面浏览器都要作哪些事情呢,以下所示:

clipboard.png

图中一帧包含了用户的交互、js的执行、以及requestAnimationFrame的调用,布局计算以及页面的重绘等工做。

假如某一帧里面要执行的任务很少,在不到16ms(1000/60)的时间内就完成了上述任务的话,那么这一帧就会有必定的空闲时间,这段时间就刚好能够用来执行requestIdleCallback的回调,以下图所示:

clipboard.png

5.简述浏览器的EventloopNode.jsEventloop

浏览器的EventLoop

clipboard.png

不想解释太多,看图

Node.jsEventLoop

clipboard.png

特别提示:网上大部分Node.jsEventLoop的面试题,都会有BUG,代码量和计算量太少,极可能尚未执行到微任务的代码,定时器就到时间被执行了

6.闭包与V8垃圾回收机制:

JS 的垃圾回收机制的基本原理是:

找出那些再也不继续使用的变量,而后释放其占用的内存,垃圾收集器会按照固定的时间间隔周期性地执行这一操做。

V8 的垃圾回收策略主要基于分代式垃圾回收机制,在 V8 中,将内存分为新生代和老生代,新生代的对象为存活时间较短的对象,老生代的对象为存活事件较长或常驻内存的对象。

clipboard.png

V8 堆的总体大小等于新生代所用内存空间加上老生代的内存空间,而只能在启动时指定,意味着运行时没法自动扩充,若是超过了极限值,就会引发进程出错。

Scavenge 算法

在分代的基础上,新生代的对象主要经过 Scavenge 算法进行垃圾回收,在 Scavenge 具体实现中,主要采用了一种复制的方式的方法—— Cheney 算法。

Cheney 算法将堆内存一分为二,一个处于使用状态的空间叫 From 空间,一个处于闲置状态的空间称为 To 空间。分配对象时,先是在 From 空间中进行分配。

当开始进行垃圾回收时,会检查 From 空间中的存活对象,将其复制到 To 空间中,而非存活对象占用的空间将会被释放。完成复制后,From 空间和 To 空间的角色发生对换。

clipboard.png
当一个对象通过屡次复制后依然存活,他将会被认为是生命周期较长的对象,随后会被移动到老生代中,采用新的算法进行管理。

还有一种状况是,若是复制一个对象到 To 空间时,To 空间占用超过了 25%,则这个对象会被直接晋升到老生代空间中。

标记-清除和标记-整理算法

对于老生代中的对象,主要采用标记-清除和标记-整理算法。标记-清除 和前文提到的标记同样,与 Scavenge 算法相比,标记清除不会将内存空间划为两半,标记清除在标记阶段会标记活着的对象,而在内存回收阶段,它会清除没有被标记的对象。

而标记整理是为了解决标记清除后留下的内存碎片问题。

增量标记(Incremental Marking)算法

前面的三种算法,都须要将正在执行的 JavaScript 应用逻辑暂停下来,待垃圾回收完毕后再恢复。这种行为叫做“全停顿”(stop-the-world)。

在 V8 新生代的分代回收中,只收集新生代,而新生代一般配置较小,且存活对象较少,因此全停顿的影响不大,而老生代就相反了。

为了下降所有老生代全堆垃圾回收带来的停顿时间,V8将标记过程分为一个个的子标记过程,同时让垃圾回收标记和JS应用逻辑交替进行,直到标记阶段完成。

clipboard.png

通过增量标记改进后,垃圾回收的最大停顿时间能够减小到原来的 1/6 左右。

内存泄漏

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存因为某种缘由程序未释放或没法释放,形成系统内存的浪费,致使程序运行速度减慢甚至系统崩溃等严重后果。

内存泄漏的常见场景:

  • 缓存:存在内存中数据一只没有被清掉
  • 做用域未释放(闭包)
  • 无效的 DOM 引用
  • 不必的全局变量
  • 定时器未清除(React中的合成事件,还有原生事件的绑定区别)
  • 事件监听为清空
  • 内存泄漏优化

7.你熟悉哪些通讯协议,它们的优缺点?

通讯协议全解

个人这篇文章很是详细介绍了 http1.0 http1.1 http2.0 https websocket等协议

8.从输入url地址栏,发生了什么?由此来介绍如何性能优化:

性能优化不彻底手册

如何优化你的超大型React应用

个人这两篇文章基本上涵盖了前端基础的性能优化,后期我会再出专栏。

9.浏览器的缓存实现,请您介绍:

1.preload,prefetch,dns-prefetch

什么是preload

使用 preload 指令的好处包括:

容许浏览器来设定资源加载的优先级所以能够容许前端开发者来优化指定资源的加载。

赋予浏览器决定资源类型的能力,所以它能分辨这个资源在之后是否能够重复利用。

浏览器能够经过指定 as 属性来决定这个请求是否符合 content security policy。

浏览器能够基于资源的类型(好比 image/webp)来发送适当的 accept 头。

Prefetch

Prefetch 是一个低优先级的资源提示,容许浏览器在后台(空闲时)获取未来可能用获得的资源,而且将他们存储在浏览器的缓存中。一旦一个页面加载完毕就会开始下载其余的资源,而后当用户点击了一个带有 prefetched 的链接,它将能够马上从缓存中加载内容。

DNS Prefetching

DNS prefetching 容许浏览器在用户浏览页面时在后台运行 DNS 的解析。如此一来,DNS 的解析在用户点击一个连接时已经完成,因此能够减小延迟。能够在一个 link 标签的属性中添加 rel="dns-prefetch' 来对指定的 URL 进行 DNS prefetching,咱们建议对 Google fonts,Google Analytics CDN 进行处理。

2.servece-worker,PWA渐进式web应用

PWA文档

clipboard.png

3.localstorage,sessionstorage,cookie,session等。
浏览器的会话存储和持久性存储
4.浏览器缓存的实现机制的实现

clipboard.png

10.同源策略是什么,跨域解决办法,cookie能够跨域吗?

跨域解决的办法

Q:为何会出现跨域问题?

A:出于浏览器的同源策略限制,浏览器会拒绝跨域请求。

  • 注:严格的说,浏览器并非拒绝全部的跨域请求,实际上拒绝的是跨域的读操做。浏览器的同源限制策略是这样执行的:

一般浏览器容许进行跨域写操做(Cross-origin writes),如连接,重定向;

一般浏览器容许跨域资源嵌入(Cross-origin embedding),如 img、script 标签;

一般浏览器不容许跨域读操做(Cross-origin reads)。

Q:什么状况才算做跨域?

A:非同源请求,均为跨域。名词解释:同源 —— 若是两个页面拥有相同的协议(protocol),端口(port)和主机(host),那么这两个页面就属于同一个源(origin)。

Q:为何有跨域需求?

A:场景 —— 工程服务化后,不一样职责的服务分散在不一样的工程中,每每这些工程的域名是不一样的,但一个需求可能须要对应到多个服务,这时便须要调用不一样服务的接口,所以会出现跨域。

方法:JSONP,CORS,postmessage,webscoket,反向代理服务器等。

上篇已经结束,欢迎你关注,等待下篇很是硬核的文章出炉~

期待你加入咱们哦~

如今一群满了,因此新开了一个二群

clipboard.png

相关文章
相关标签/搜索