vue虚拟dom和diff算法面试题(vue虚拟dom的优缺点)

今天给各位分享vue虚拟dom和diff算法面试题的知识,其中也会对vue虚拟dom的优缺点进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

前端经典面试题(60道前端面试题包含JS、CSS、React、浏览器等)

防抖

节流

误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。

实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是来源与浏览器或web服务器,浏览器或web服务器限制了url的长度。为了明确这个概念,我们必须再次强调下面几点:

补充补充一个get和post在缓存方面的区别:

可从IIFE、AMD、CMD、CommonJS、UMD、webpack(require.ensure)、ES Module、

vue和react都是采用diff算法来对比新旧虚拟节点,从而更新节点。在vue的diff函数中(建议先了解一下diff算法过程)。在交叉对比中,当新节点跟旧节点 头尾交叉对比 没有结果时,会根据新节点的key去对比旧节点数组中的key,从而找到相应旧节点(这里对应的是一个key = index 的map映射)。如果没找到就认为是一个新增节点。而如果没有key,那么就会采用遍历查找的方式去找到对应的旧节点。一种一个map映射,另一种是遍历查找。相比而言。map映射的速度更快。vue部分源码如下:

创建map函数

遍历寻找

在React中, 如果是由React引发的事件处理(比如通过onClick引发的事件处理),调用setState不会同步更新this.state,除此之外的setState调用会同步执行this.state 。所谓“除此之外”,指的是绕过React通过addEventListener直接添加的事件处理函数,还有通过setTimeout/setInterval产生的异步调用。

**原因:**在React的setState函数实现中,会根据一个变量isBatchingUpdates判断是直接更新this.state还是放到队列中回头再说,而isBatchingUpdates默认是false,也就表示setState会同步更新this.state,但是, 有一个函数batchedUpdates,这个函数会把isBatchingUpdates修改为true,而当React在调用事件处理函数之前就会调用这个batchedUpdates,造成的后果,就是由React控制的事件处理过程setState不会同步更新this.state 。

虚拟dom相当于在js和真实dom中间加了一个缓存,利用dom diff算法避免了没有必要的dom操作,从而提高性能。

具体实现步骤如下:

用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文档当中

当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较,记录两棵树差异

把2所记录的差异应用到步骤1所构建的真正的DOM树上,视图就更新了。

结构:display:none: 会让元素完全从渲染树中消失,渲染的时候不占据任何空间, 不能点击, visibility: hidden:不会让元素从渲染树消失,渲染元素继续占据空间,只是内容不可见,不能点击 opacity: 0: 不会让元素从渲染树消失,渲染元素继续占据空间,只是内容不可见,可以点击

继承:display: none:是非继承属性,子孙节点消失由于元素从渲染树消失造成,通过修改子孙节点属性无法显示。visibility: hidden:是继承属性,子孙节点消失由于继承了hidden,通过设置visibility: visible;可以让子孙节点显式。

性能:displaynone : 修改元素会造成文档回流,读屏器不会读取display: none元素内容,性能消耗较大 visibility:hidden: 修改元素只会造成本元素的重绘,性能消耗较少读屏器读取visibility: hidden元素内容 opacity: 0 :修改元素会造成重绘,性能消耗较少

联系:它们都能让元素不可见

常用的一般为三种 .clearfix , clear:both , overflow:hidden ;

比较好是 .clearfix ,伪元素万金油版本,后两者有局限性.

clear:both :若是用在同一个容器内相邻元素上,那是贼好的,有时候在容器外就有些问题了, 比如相邻容器的包裹层元素塌陷

overflow:hidden :这种若是用在同个容器内,可以形成 BFC 避免浮动造成的元素塌陷

概念:将多个小图片拼接到一个图片中。通过 background-position 和元素尺寸调节需要显示的背景图案。

优点:

缺点:

block 元素特点:

1.处于常规流中时,如果 width 没有设置,会自动填充满父容器 2.可以应用 margin/padding 3.在没有设置高度的情况下会扩展高度以包含常规流中的子元素 4.处于常规流中时布局时在前后元素位置之间(独占一个水平空间) 5.忽略 vertical-align

inline 元素特点

1.水平方向上根据 direction 依次布局

2.不会在元素前后进行换行

3.受 white-space 控制

4. margin/padding 在竖直方向上无效,水平方向上有效

5. width/height 属性对非替换行内元素无效,宽度由元素内容决定

6.非替换行内元素的行框高由 line-height 确定,替换行内元素的行框高由 height , margin , padding , border 决定 7.浮动或绝对定位时会转换为 block 8. vertical-align 属性生效

GIF :

JPEG :

PNG :

七种数据类型

(ES6之前)其中5种为基本类型: string , number , boolean , null , undefined ,

ES6出来的 Symbol 也是原始数据类型 ,表示独一无二的值

Object 为引用类型(范围挺大),也包括数组、函数,

输出结果是:

工厂模式

简单的工厂模式可以理解为解决多个相似的问题;

单例模式

只能被实例化(构造函数给实例添加属性与方法)一次

沙箱模式

将一些函数放到自执行函数里面,但要用闭包暴露接口,用变量接收暴露的接口,再调用里面的值,否则无法使用里面的值

1.字面量

2.Object构造函数创建

3.使用工厂模式创建对象

4.使用构造函数创建对象

HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件onclick、页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件。想要知道这些事件是在什么时候进行调用的,就需要了解一下“事件流”的概念。

什么是事件流:事件流描述的是从页面中接收事件的顺序,DOM2级事件流包括下面几个阶段。

addEventListener : addEventListener 是DOM2 级事件新增的指定事件处理程序的操作,这个方法接收3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。最后这个布尔值参数如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。

IE只支持事件冒泡 。

获取一个对象的原型,在chrome中可以通过__proto__的形式,或者在ES6中可以通过Object.getPrototypeOf的形式。

那么Function.proto是什么么?也就是说Function由什么对象继承而来,我们来做如下判别。

我们发现Function的原型也是Function。

我们用图可以来明确这个关系:

这里来举个栗子,以 Object 为例,我们常用的 Object 便是一个构造函数,因此我们可以通过它构建实例。

则此时, 实例为instance , 构造函数为Object ,我们知道,构造函数拥有一个 prototype 的属性指向原型,因此原型为:

这里我们可以来看出三者的关系:

在 JS 中,继承通常指的便是 原型链继承 ,也就是通过指定原型,并可以通过原型链继承原型上的属性或者方法。

在函数式编程中,函数是一等公民。那么函数柯里化是怎样的呢?

函数柯里化指的是将能够接收多个参数的函数转化为接收单一参数的函数,并且返回接收余下参数且返回结果的新函数的技术。

函数柯里化的主要作用和特点就是参数复用、提前返回和延迟执行。

在一个函数中,首先填充几个参数,然后再返回一个新的函数的技术,称为函数的柯里化。通常可用于在不侵入函数的前提下,为函数 预置通用参数 ,供多次重复调用。

call 和 apply 都是为了解决改变 this 的指向。作用都是相同的,只是传参的方式不同。

除了第一个参数外, call 可以接收一个参数列表, apply 只接受一个参数数组。

bind 和其他两个方法作用也是一致的,只是该方法会返回一个函数。并且我们可以通过 bind 实现柯里化。

如何实现一个 bind 函数

对于实现以下几个函数,可以从几个方面思考

如何实现一个call函数

如何实现一个apply函数

箭头函数其实是没有 this 的,这个函数中的 this 只取决于他外面的第一个不是箭头函数的函数的 this 。在这个例子中,因为调用 a 符合前面代码中的第一个情况,所以 this 是 window 。并且 this 一旦绑定了上下文,就不会被任何代码改变。

关于 let 的是否存在变量提升,我们何以用下面的例子来验证:

let 变量如果不存在变量提升, console.log(name) 就会输出 ConardLi ,结果却抛出了 ReferenceError ,那么这很好的说明了, let 也存在变量提升,但是它存在一个“暂时死区”,在变量未初始化或赋值前不允许访问。

变量的赋值可以分为三个阶段:

关于 let 、 var 和 function :

依次输出:undefined - 10 - 20

答案: D

colorChange 方法是静态的。静态方法仅在创建它们的构造函数中存在,并且不能传递给任何子级。由于 freddie 是一个子级对象,函数不会传递,所以在 freddie 实例上不存在 freddie 方法:抛出 TypeError 。

1.使用第一次push,obj对象的push方法设置 obj[2]=1;obj.length+=1 2.使用第二次push,obj对象的push方法设置 obj[3]=2;obj.length+=1 3.使用console.log输出的时候,因为obj具有 length 属性和 splice 方法,故将其作为数组进行打印 4.打印时因为数组未设置下标为 0 1 处的值,故打印为empty,主动 obj[0] 获取为 undefined

undefined {n:2}

首先,a和b同时引用了{n:2}对象,接着执行到a.x = a = {n:2}语句,尽管赋值是从右到左的没错,但是.的优先级比=要高,所以这里首先执行a.x,相当于为a(或者b)所指向的{n:1}对象新增了一个属性x,即此时对象将变为{n:1;x:undefined}。之后按正常情况,从右到左进行赋值,此时执行a ={n:2}的时候,a的引用改变,指向了新对象{n:2},而b依然指向的是旧对象。之后执行a.x = {n:2}的时候,并不会重新解析一遍a,而是沿用最初解析a.x时候的a,也即旧对象,故此时旧对象的x的值为{n:2},旧对象为 {n:1;x:{n:2}},它被b引用着。后面输出a.x的时候,又要解析a了,此时的a是指向新对象的a,而这个新对象是没有x属性的,故访问时输出undefined;而访问b.x的时候,将输出旧对象的x的值,即{n:2}。

在比较相等性,原始类型通过它们的值进行比较,而对象通过它们的引用进行比较。 JavaScript 检查对象是否具有对内存中相同位置的引用。

我们作为参数传递的对象和我们用于检查相等性的对象在内存中位于不同位置,所以它们的引用是不同的。

这就是为什么 { age: 18 } === { age: 18 } 和 { age: 18 } == { age: 18 } 返回 false 的原因。

所有对象键(不包括 Symbols )都会被存储为字符串,即使你没有给定字符串类型的键。这就是为什么 obj.hasOwnProperty('1') 也返回 true 。

上面的说法不适用于 Set 。在我们的 Set 中没有 “1” : set.has('1') 返回 false 。它有数字类型 1 , set.has(1) 返回 true 。

这题考察的是对象的键名的转换。

catch 块接收参数 x 。当我们传递参数时,这与变量的 x 不同。这个变量 x 是属于 catch 作用域的。

之后,我们将这个块级作用域的变量设置为 1 ,并设置变量 y 的值。现在,我们打印块级作用域的变量 x ,它等于 1 。

在 catch 块之外, x 仍然是 undefined ,而 y 是 2 。当我们想在 catch 块之外的 console.log(x) 时,它返回 undefined ,而 y 返回 2 。

【面试题解析】从 Vue 源码分析 key 的作用

最近看了面试题中有一个这样的题, v-for 为什么要绑定 key?

Vue 中 key 很多人都弄不清楚有什么作用,甚至还有些人认为不绑定 key 就会报错。

其实没绑定 key 的话,Vue 还是可以正常运行的,报警告是因为没通过 Eslint 的检查。

接下来将通过源码一步步分析这个 key 的作用。

Virtual DOM 最主要保留了 DOM 元素的层级关系和一些基本属性,本质上就是一个 JS 对象。相对于真实的 DOM,Virtual DOM 更简单,操作起来速度更快。

如果需要改变 DOM,则会通过新旧 Virtual DOM 对比,找出需要修改的节点进行真实的 DOM 操作,从而减小性能消耗。

传统的 Diff 算法需要遍历一个树的每个节点,与另一棵树的每个节点对比,时间复杂度为 O(n²)。

Vue 采用的 Diff 算法则通过逐级对比,大大降低了复杂性,时间复杂度为 O(n)。

VNode 更新首先会经过 patch 函数, patch 函数源码如下:

vnode 表示更新后的节点,oldVnode 表示更新前的节点,通过对比新旧节点进行操作。

1、vnode 未定义,oldVnode 存在则触发 destroy 的钩子函数

2、oldVnode 未定义,则根据 vnode 创建新的元素

3、oldVnode 不为真实元素并且 oldVnode 与 vnode 为同一节点,则会调用 patchVnode 触发更新

4、oldVnode 为真实元素或者 oldVnode 与 vnode 不是同一节点,另做处理

接下来会进入 patchVnode 函数,源码如下:

1、vnode 的 text 不存在,则会比对 oldVnode 与 vnode 的 children 节点进行更新操作

2、vnode 的 text 存在,则会修改 DOM 节点的 text

接下来在 updateChildren 函数内就可以看到 key 的用处。

key 的作用主要是给 VNode 添加唯一标识,通过这个 key,可以更快找到新旧 VNode 的变化,从而进一步操作。

key 的作用主要表现在以下这段源码中。

updateChildren 过程为:

1、分别用两个指针(startIndex, endIndex)表示 oldCh 和 newCh 的头尾节点

2、对指针所对应的节点做一个两两比较,判断是否属于同一节点

3、如果4种比较都没有匹配,那么判断是否有 key,有 key 就会用 key 去做一个比较;无 key 则会通过遍历的形式进行比较

4、比较的过程中,指针往中间靠,当有一个 startIndex endIndex,则表示有一个已经遍历完了,比较结束

从 VNode 的渲染过程可以得知,Vue 的 Diff 算法先进行的是同级比较,然后再比较子节点。

子节点比较会通过 startIndex、endIndex 两个指针进行两两比较,再通过 key 比对子节点。如果没设置 key,则会通过遍历的方式匹配节点,增加性能消耗。

所以不绑定 key 并不会有问题,绑定 key 之后在性能上有一定的提升。

综上,key 主要是应用在 Diff 算法中,作用是为了更快速定位出相同的新旧节点,尽量减少 DOM 的创建和销毁的操作。

希望以上内容能够对各位小伙伴有所帮助,祝大家面试顺利。

Vue 的文档中对 key 的说明如下:

关于就地修改,关键在于 sameVnode 的实现,源码如下:

可以看出,当 key 未绑定时,主要通过元素的标签等进行判断,在 updateChildren 内会将 oldStartVnode 与 newStartVnode 判断为同一节点。

如果 VNode 中只包含了文本节点,在 patchVnode 中可以直接替换文本节点,而不需要移动节点的位置,确实在不绑定 key 的情况下效率要高一丢丢。

某些情况下不绑定 key 的效率更高,那为什么大部分Eslint的规则还是要求绑定 key 呢?

因为在实际项目中,大多数情况下 v-for 的节点内并不只有文本节点,那么 VNode 的字节点就要进行销毁和创建的操作。

相比替换文本带来的一丢丢提升,这部分会消耗更多的性能,得不偿失。

了解了就地修改,那么我们在一些简单节点上可以选择不绑定 key,从而提高性能。

如果你喜欢我的文章,希望可以关注一下我的公众号【前端develop】

史上最全前端vue面试题!推荐收藏

1.为什么会形成跨域?

不是一个源的文件操作另一个源的文件就会形成跨域。当请求端的协议、域名、端口号和服务器的协议、域名、端口号有一个不一致就会发生跨域。

解决方法:安装插件

Pip install django-cors-headers

2.vuex的工作流程?

① 在vue组件里面,通过dispatch来出发actions提交修改数据的操作。

② 然后再通过actions的commit来出发mutations来修改数据。

③ mutations接收到commit的请求,就会自动通过Mutate来修改state(数据中心里面的数据状态)里面的数据。

④ 最后由store触发每一个调用它的组件更新。

3.vuex是什么?怎么使用?

vuex是一个专为vue.js应用程序开发的状态管理模式。使用:store,getters,mutations,actions,modules详细使用写法请见:

4.vuex中的数据在页面刷新后数据消失怎么解决?

使用sessionStorage或localStorage存储数据;也可以引入vuex-persist插件

5.在vue中,如何阻止事件冒泡和默认行为?

在绑定事件时,在指令后边加上修饰符.stop来阻止冒泡,.prevent来阻止默认行为

6.深拷贝与浅拷贝?

假设B复制A,修改A的时候,看B是否变化:B变了是浅拷贝(修改堆内存中的同一个值),没变是深拷贝(修改堆内存中不同的值)。浅拷贝只是增加了一个指针指向已存在的内存地址,深拷贝是增加了一个指针并申请了一个新的内存,使这个增加的指针指向这个新的内存。深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。

7.vue的生命周期?

beforeCreate created beforeMount mounted beforeUpdate updated beforeDestroy destroyedactived deactived (keep-alive)组件是否激活调用

8. keep-alive: 组件缓存

router.js中:

meta: {keepAlive:true} // 需要被缓存

钩子执行顺序:created - mounted - actived

include表示需要缓存的页面;exclude表示不需要缓存的页面。如果两个同时设置,exclude优先级更 改,则组件不会被缓存。

应用场景: 用户在某个列表页面选择筛选条件过滤出一份数据列表,由列表页面进入数据详情页面,再返回 该列表页,我们希望列表页可以保留用户的筛选状态。

9.vue传值方式?

props $emit() $on() $parent $children $listener $attr

10. $on 兄弟组件传值

$emit 分发

$on 监听

$off 取消监听

$once 一次性监听一个事件

在js文件中定义一个中央事件总线Bus,并暴露出来

具体的实现方式:

使用Bus的时候在接收Bus的组件的beforeDestroy函数中销毁Bus,否则会一直叠加调用这个方法。

应用场景:“退出登录” - ①点击退出登录;②修改密码后自动退出登录

11.组件跨级传值

$attrs a-b-c

$listeners 监听

12.vue事件修饰符有哪些?

.stop .prevent .self .once .passive .sync

13.箭头函数中的this?

不具有this绑定,但函数体可以使用this,这个this指向的是箭头函数当前所处的词法环境中的this对象。

15.为什么vue组件中data必须是一个函数?

如果不是函数的话,每个组件的data都是内存的同一个地址,一个数据改变了其他也改变了,当他是一个函数时,每个组件实例都有自己的作用域,每个实例相互独立,就不会互相影响。

16.v-if 和 v-show区别?

v-if 是对标签的创建与销毁, v-show 则仅在初始化时加载一次,v-if 开销相对来说比v-show 大;

v-if 是惰性的;v-show 做的仅是简单的css切换。

17.v-text 与 v-html区别?

v-text 用于普通文本,不能解析html;

v-html 反之。

18.v-for key的作用?

使用v-for更新渲染过的数据,它默认用“就地复用”策略。如果数据项的顺序改变,vue将不是移动DOM元素来匹配数据项的改变,而是简单地复用此处每个元素,并确保在特定索引下显示已被渲染过的每个元素。key属性类型只能是string或number。

key的特殊属性主要用在虚拟DOM算法,在新旧node对比时辨识VNods。如不使用key,vue会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法,它会基于key的变化重新排列元素顺序。

19.Scss是什么?在vue-cli中安装步骤?有哪几大特性?

npm 下载loader (sass-loader,css-loader,node-sass),在webpack中配置extends属性(加.scss拓展) Vscode中可在扩展中下载;

特性:可以用变量,可以用混合器,可以嵌套等。

20.vue获取dom?

ref

21.vue初始化页面闪动问题?

webpack、vue-router

v-cloak css:[v-cloak]:display:none

22.什么是vue-router?

vue router 是官方路由管理器。

主要功能:路由嵌套,模块化 基于组件路由配置,路由参数、查询、通配符,细粒度导航控制,自定义的滚动条行为等。

23.vue路由传参,接收?

传: this.$router.push({path:'', query(params):{}})

接:this.$router.query.xxx

24.防抖和节流?

节流是一定时间内执行一次函数,多用在scroll事件上;

防抖是在一定时间内执行最后一次的函数,多用在input输入操作,表单提交等。

25.如何让scss只在当前组件中起作用?

WEB前端面试题

第二章 面试题基础篇

2.1 HTML面试题

面试题:行内元素有哪些?块级元素有哪些? 空(void)元素有那些?

面试题:页面导入样式时,使用link和@import有什么区别?

面试题:title与h1的区别、b与strong的区别、i与em的区别?

面试题:img标签的title和alt有什么区别?

面试题:png、jpg、gif 这些图片格式解释一下,分别什么时候用?

2.2 CSS面试题

面试题:css背景纹路

面试题:介绍一下CSS的盒子模型

面试题:CSS选择符有哪些?哪些属性可以继承?

面试题:CSS优先级算法如何计算?

面试题:用CSS画一个三角形

面试题:一个盒子不给宽度和高度如何水平垂直居中?

面试题:display有哪些值?说明他们的作用。

面试题:对BFC规范(块级格式化上下文:block formatting context)的理解?

面试题:清除浮动有哪些方式?

面试题:在网页中的应该使用奇数还是偶数的字体?为什么呢?

面试题:写一个左中右布局占满屏幕,其中左、右俩块固定宽200,中间自适应宽,要求先加载中间块,请写出结构及样式。

面试题:什么是CSS reset?

面试题:css sprite是什么,有什么优缺点

面试题:display: none;与visibility: hidden;的区别

面试题:position有哪些值?有什么作用? 【特别多公司问】

面试题:line-height和height有什么区别?

面试题:opacity 和 rgba区别

2.3 JavaScript基础面试题

面试题:延迟加载JS有哪些方式?

面试题:JS数据类型有哪些?

面试题:null和undefined的区别

面试题:JS数据类型考题

面试题:==和===有什么不同

面试题:JS微任务和宏任务

面试题:JS作用域考题

面试题:JS对象考题

面试题:JS作用域+this指向+原型 考题

面试题:JS判断变量是不是数组,你能写出哪些方法?

面试题:slice是干嘛的、splice是否会改变原数组

面试题:JS数组去重

面试题:找出多维数组最大值

面试题:给字符串新增方法实现功能

面试题:找出字符串出现最多次数的字符以及次数

2.4 真正移动端 —— H5/C3面试题

面试题:什么是语义化标签

面试题:::before 和 :after中双冒号和单冒号 有什么区别?解释一下这2个伪元素的作用。

面试题:如何关闭iOS键盘首字母自动大写

面试题:怎么让Chrome支持小于12px 的文字?

面试题:rem和em有什么样区别

面试题:ios系统中元素被触摸时产生的半透明灰色遮罩怎么去掉

面试题:webkit表单输入框placeholder的颜色值能改变吗?

面试题:禁止ios 长按时不触发系统的菜单,禁止iosandroid长按时下载图片

面试题:禁止ios和android用户选中文字

面试题:自适应 [淘宝无线适配]

面试题:响应式

第三章 面试题进阶篇

3.1 JavaScript进阶面试题

面试题:new操作符具体做了什么

面试题:闭包 【必须会】

面试题:原型链 【必须会】

面试题: JS继承有哪些方式

面试题:说一下call、apply、bind区别

面试题:sort背后原理是什么?

面试题:深拷贝和浅拷贝

面试题:localstorage、sessionstorage、cookie的区别

3.2 ES6面试题

面试题:var、let、const区别

面试题:作用域考题

面试题:将下列对象进行合并

面试题:箭头函数和普通函数有什么区别?

面试题:Promise有几种状态

面试题:find和filter的区别 【大厂】

面试题:some和every的区别 【大厂】

3.3 webpack面试题

面试题:webpack插件

3.4 Git面试题

面试题:git常用命令

面试题:解决冲突

面试题:GitFlow

第四章 面试题框架篇

4.1 区分初中高级的 —— Vue面试题

面试题:Vue2.x 生命周期有哪些?

1.系统自带八个

2.当一旦进入到某个组件会执行哪些生命周期

3.$el和$data在哪个阶段有

4.如果使用keep-alive会多俩个生命周期

5.如果加入keep-alive第一次进入组件会执行哪些生命周期

6.如果加入keep-alive第二次或者第N进入该组件会执行哪些生命周期

面试题:谈谈你对keep-alive的了解

面试题:v-if和v-show区别

面试题:v-if和v-for优先级 2.x

面试题:ref是什么?

面试题:nextTick是什么?

面试题:Vue中如何做样式穿透

面试题:scoped原理

面试题:Vuex是单向数据流还是双向数据流?

面试题:讲一下MVVM

面试题:双向绑定原理

面试题:什么是虚拟DOM

面试题:key是干什么?

面试题:diff算法

面试题:Vue组件传值

面试题:props和data优先级谁高?

面试题:computed、methods、watch有什么区别?

面试题:Vuex

面试题:Vue路由

面试题:Vue项目打包后出现空白页

4.2 微信小程序面试题

面试题:如何自定义头部?

面试题:如何自定义底部?

4.3 uni-app面试题

面试题:生命周期

面试题:条件编译

第五章 面试题性能优化篇

面试中的网红Vue源码解析之虚拟DOM,你知多少呢?深入解读diff算法

众所周知,在前端的面试中,面试官非常爱考dom和diff算法。比如,可能会出现在以下场景

滴滴滴,面试官发来一个面试邀请。接受邀请?

我们都知道, key 的作用在前端的面试是一道很普遍的题目,但是呢,很多时候我们都只浮于知识的表面,而没有去深挖其原理所在,这个时候我们的竞争力就在这被拉下了。所以呢,深入学习原理对于提升自身的核心竞争力是一个必不可少的过程。

在接下来的这篇文章中,我们将讲解面试中很爱考的虚拟DOM以及其背后的diff算法。 请认真阅读本文~文末有学习资源免费共享!!!

虚拟DOM是用JavaScript对象描述DOM的层次结构。DOM中的一切属性都在虚拟DOM中有对应的属性。本质上是JS 和 DOM 之间的一个映射缓存。

要点:虚拟 DOM 是 JS 对象;虚拟 DOM 是对真实 DOM 的描述。

diff发生在虚拟DOM上。diff算法是在新虚拟DOM和老虚拟DOM进行diff(精细化比对),实现最小量更新,最后反映到真正的DOM上。

我们前面知道diff算法发生在虚拟DOM上,而虚拟DOM是如何实现的呢?实际上虚拟DOM是有一个个虚拟节点组成。

h函数用来产生虚拟节点(vnode)。虚拟节点有如下的属性:

1)sel: 标签类型,例如 p、div;

2)data: 标签上的数据,例如 style、class、data-*;

3)children :子节点;

4) text: 文本内容;

5)elm:虚拟节点绑定的真实 DOM 节点;

通过h函数的嵌套,从而得到虚拟DOM树。

我们编写了一个低配版的h函数,必须传入3个参数,重载较弱。

形态1:h('div', {}, '文字')

形态2:h('div', {}, [])

形态3:h('div', {}, h())

首先定义vnode节点,实际上就是把传入的参数合成对象返回。

[图片上传失败...(image-7a9966-1624019394657)]

然后编写h函数,根据第三个参数的不同进行不同的响应。

当我们进行比较的过程中,我们采用的4种命中查找策略:

1)新前与旧前:命中则指针同时往后移动。

2)新后与旧后:命中则指针同时往前移动。

3)新后与旧前:命中则涉及节点移动,那么新后指向的节点,移到 旧后之后 。

4)新前与旧后:命中则涉及节点移动,那么新前指向的节点,移到 旧前之前 。

命中上述4种一种就不在命中判断了,如果没有命中,就需要循环来寻找,移动到旧前之前。直到while(新前=新后旧前=就后)不成立则完成。

如果是新节点先循环完毕,如果老节点中还有剩余节点(旧前和旧后指针中间的节点),说明他们是要被删除的节点。

如果是旧节点先循环完毕,说明新节点中有要插入的节点。

1.什么是Virtual DOM 和Snabbdom

2.手写底层源码h函数

3.感受Vue核心算法之diff算法

4.snabbdom之核心h函数的工作原理

1、零基础入门或者有一定基础的同学、大中院校学生

2、在职从事相关工作1-2年以及打算转行前端的朋友

3、对前端开发有兴趣人群

关于vue虚拟dom和diff算法面试题和vue虚拟dom的优缺点的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


【免责声明】:

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

【关于转载】:

本站尊重互联网版权体系,本站部分图片、文章大部分转载于互联网、所有内容不代表本站观点、不对文章中的任何观点负责、转载的目的只用于给网民提供信息阅读,无任何商业用途,所有内容版权归原作者所有
如本站(文章、内容、图片、视频)任何资料有侵权,先说声抱歉;麻烦您请联系请后台提交工单,我们会立即删除、维护您的权益。非常感谢您的理解。

【附】:

二○○二年一月一日《计算机软件保护条例》第十七条规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!

注:本站资源来自网络转载,版权归原作者和公司所有,如果有侵犯到您的权益,请第一时间联系我们处理!

-----------------------------------------------------------------------------------------------------------

【版权声明】:

一、本站致力于为源码爱好者提供国内外软件开发技术和软件共享,着力为用户提供优资资源。
二、本站提供的源码下载文件为网络共享资源,请于下载后的24小时内删除。如需体验更多乐趣,还请支持正版。
三、如有内容侵犯您的版权或其他利益的,请编辑邮件并加以说明发送到站长邮箱。站长会进行审查之后,情况属实的会在三个工作日内为您删除。
-----------------------------------------------------------------------------------------------------------


内容投诉
源码村资源网 » vue虚拟dom和diff算法面试题(vue虚拟dom的优缺点)
您需要 登录账户 后才能发表评论

发表评论

欢迎 访客 发表评论