前端面试八股文-杂谈

github大厂面试题精选

一、知道虚拟Dom吗?大致聊聊

1、什么是虚拟 DOM (vdom)

 虚拟DOM(Virtual DOM)是指一个虚拟的、内存中的DOM节点树,它是通过JavaScript对象来模拟真实的DOM结构,而不是直接操作真实的DOM。虚拟DOM通常会在每次页面渲染时被创建,通过对虚拟DOM的修改来实现对页面的更新。

2、实现原理

 虚拟DOM的实现原理是在JavaScript中对DOM树进行操作,然后将修改的结果映射到真实的DOM上。这种映射方式可以大大减少DOM操作的次数,从而提高页面性能。因为真实的DOM是非常庞大而复杂的,而且在每次更新时都要重新计算布局和样式,所以频繁地直接操作真实的DOM会非常消耗性能。

  通过使用虚拟DOM,开发者可以在JavaScript中对DOM进行修改,然后由虚拟DOM引擎自动计算出DOM树的差异,最后只需要更新差异部分的真实DOM,以此来实现高效的页面渲染和更新。

3、虚拟 DOM 的优缺点

优点:

降低浏览器性能消耗
因为Javascript的运算速度远大于DOM操作的执行速度,因此,运用patching算法来计算出真正需要更新的节点,最大限度地减少DOM操作,从而提高性能。

在vnode技术出现之前,我们要改变页面展示的内容只能通过遍历查询 dom 树的方式找到需要修改的 dom,然后修改样式行为或者结构,来达到更新 ui 的目的。这种方式相当消耗计算资源,因为每次查询 dom 几乎都需要遍历整颗 dom树。

在vnode技术出现之后,我们建立一个虚拟 dom 对象来对应真实的 dom 树,那么每次 dom 的更改就变成了 js 对象的属性的更改 ,这样一来就能查找 js 对象的属性变化要比查询 dom 树的 性能开销小。

diff算法,减少回流和重绘
通过diff算法,优化遍历,对真实dom进行打补丁式的新增、修改、删除,实现局部更新,减少回流和重绘。

vnode优化性能核心思想,就是每次更新 dom 都尽量避免刷新整个页面,而是有针对性的 去刷新那被更改的一部分 ,来释放掉被无效渲染占用的 gpu,cup性能。同时,也减少了大量的dom操作,减少了浏览器的回流和重绘。

跨平台
虚拟 DOM 本质上是 JavaScript 对象,而 DOM 与平台强相关,相比之下虚拟 DOM ,可以进行更方便地跨平台操作,例如:服务器渲染、weex 开发等等

缺点

首次显示要慢些:
首次渲染大量DOM时,由于多了一层虚拟DOM的计算, 会比innerHTML插入慢

无法进行极致优化:
虽然虚拟 DOM + 合理的优化,足以应对绝大部分应用的性能需求,但在一些性能要求极高的应用中 无法进行针对性的极致优化。

4、Virtual DOM 真的比操作原生 DOM 快吗

这是一个性能 vs. 可维护性的取舍。框架的意义在于为你掩盖底层的 DOM 操作,让你用更声明式的方式来描述你的目的,从而让你的代码更容易维护。

没有任何框架可以比纯手动的优化 DOM 操作更快,因为框架的 DOM 操作层需要应对任何上层 API 可能产生的操作,它的实现必须是普适的。

二、理解xss、csrf、ddos攻击原理以及避免方式

1、XSS

XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击。攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,session tokens,或者其它敏感的网站信息,对用户进行钓鱼欺诈,甚至发起蠕虫攻击等。

XSS避免方式

  • url参数使用encodeURIComponent方法转义
  • 尽量不是有InnerHtml插入HTML内容
  • 使用特殊符号、标签转义符。
2、CSRF

CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

CSRF避免方式:

  • 添加验证码
  • 使用token
  • 服务端给用户生成一个token,加密后传递给用户
  • 用户在提交请求时,需要携带这个token
  • 服务端验证token是否正确
3、DDoS

DDoS又叫分布式拒绝服务,全称 Distributed Denial of Service,其原理就是利用大量的请求造成资源过载,导致服务不可用。

DDos避免方式

  • 限制单IP请求频率。
  • 防火墙等防护设置禁止ICMP包等
  • 检查特权端口的开放

三、聊聊你认识中的Web性能优化?有哪些点?

性能优化大全:

【前端面试题】10—21道关于性能优化的面试题(附答案) (qq.com)

四、浏览器是如何渲染UI的?

  • 浏览器获取HTML文件,然后对文件进行解析,形成DOM Tree
  • 与此同时,进行CSS解析,生成Style Rules
  • 接着将DOM Tree与Style Rules合成为 Render Tree
  • 接着进入布局(Layout)阶段,也就是为每个节点分配一个应出现在屏幕上的确切坐标
  • 随后调用GPU进行绘制(Paint),遍历Render Tree的节点,并将元素呈现出来

五、浏览器重绘与重排的区别?

重排/回流(Reflow)

当DOM的变化影响了元素的几何信息,浏览器需要重新计算元素的几何属性,将其安放在界面中的正确位置,这个过程叫做重排。表现为重新生成布局,重新排列元素。

重绘(Repaint):

当一个元素的外观发生改变,但没有改变布局,重新把元素外观绘制出来的过程,叫做重绘。表现为某些元素的外观被改变
单单改变元素的外观,肯定不会引起网页重新生成布局,但当浏览器完成重排之后,将会重新绘制受到此次重排影响的部分

代价

重排和重绘代价是高昂的,它们会破坏用户体验,并且让UI展示非常迟缓,而相比之下重排的性能影响更大,在两者无法避免的情况下,一般我们宁可选择代价更小的重绘。

划重点

『重绘』不一定会出现『重排』,『重排』必然会出现『重绘』。

六、谈谈对vue生命周期的理解?

  • create阶段:vue实例被创建
    beforeCreate: 最初调用触发,创建前,此时data和methods中的数据都还没有初始化,data和events都不能用
    created 创建完毕,data中有值,未挂载,data和events已经初始化好,data已经具有响应式;在这里可以发送请求
  • mount阶段: vue实例被挂载到真实DOM节点
    beforeMount在模版编译之后,渲染之前触发,可以发起服务端请求,去数据,ssr中不可用,基本用不上这个hook
    mounted: 在渲染之后触发,此时可以操作DOM,并能访问组件中的DOM以及$ref,SSR中不可用
  • update阶段:当vue实例里面的data数据变化时,触发组件的重新渲染
    beforeUpdate :更新前,在数据变化后,模版改变前触发,切勿使用它监听数据变化
    updated更新后,在数据改变后,模版改变后触发,常用于重渲染案后的打点,性能检测或触发vue组件中非vue组件的更新
  • destroy阶段:vue实例被销毁
    beforeDestroy:实例被销毁前,组件卸载前触发,此时可以手动销毁一些方法,可以在此时清理事件、计时器或者取消订阅操作
    destroyed: 卸载完毕后触发,销毁后,可以做最后的打点或事件触发操作

七、为什么v-for和v-if不建议用在一起?

渲染顺序问题:v-if 和 v-for 在渲染顺序上存在冲突。Vue.js 的渲染顺序规定,v-for 的优先级高于 v-if。也就是说,在每次循环迭代时,v-if 的条件判断都会执行一次。这可能会导致一些意外的结果,特别是在有大量数据和复杂条件逻辑的情况下。

可读性和维护性:同时使用 v-if 和 v-for 可能会增加代码的复杂性,降低代码的可读性和维护性。两个指令的同时使用可能导致逻辑难以理解和排查错误,特别是在较大的代码库中。

如何解决这个问题:
使用计算属性:将需要根据条件进行过滤的数据处理逻辑放到计算属性中,并在模板中使用该计算属性进行循环渲染。这样可以避免在模板中使用 v-if 和 v-for 同时存在的问题。

数据预处理:在数据传递给模板之前,先对数据进行处理,根据条件将需要渲染的数据进行筛选或过滤,然后再进行循环渲染。

使用