前端面试押题
  • HTML
    • 有哪些新标签?
    • SVG 的区别是什么?
    • 如何理解 HTML 中的语义化标签
  • CSS
    • 如何清除浮动?
    • CSS 选择器优先级如何确定?
    • BFC 是什么
    • 两种盒模型(box-sizing)的区别?
    • 如何实现垂直居中?
  • JavaScript 押题基础篇
    • new 做了什么?
    • JS 如何实现类?
    • JS 的闭包是什么?怎么用?
    • JS 如何实现继承?
    • JS 的立即执行函数是什么?
    • JS 的数据类型有哪些?
    • 原型链是什么?
    • 这段代码中的 this 是多少?
  • JavaScript 押题手写篇
    • 手写数组去重
    • 手写简化版 Promise
    • 手写 AJAX
    • 手写深拷贝
    • 手写节流 throttle、防抖 debounce
    • 手写发布订阅
    • 手写 Promise.all
  • DOM 押题
    • 请简述 DOM 事件模型
    • 手写可拖曳 div
    • 手写事件委托
  • HTTP 押题
    • 说说同源策略和跨域
    • POST 的区别有哪些?
    • TCP 三次握手和四次挥手是什么?
    • Session、Cookie、LocalStorage、SessionStorage 的区别
    • HTTP 缓存有哪些方案?
    • HTTPS 的区别有哪些?
    • HTTP/2 的区别有哪些?
  • React 押题
    • 什么是高阶组件 HOC?
    • React Hooks 如何模拟组件生命周期?
    • 你如何理解 Redux?
    • React 有哪些生命周期钩子函数?数据请求放在哪个钩子里?
    • React 如何实现组件间通信
    • 虚拟 DOM 的原理是什么?
    • Vue DOM diff 的区别?
    • DOM diff 算法是怎样的?
  • Node.js 押题
    • 浏览器里的微任务和任务是什么?
    • EventLoop 是什么?
    • koa.js 的区别是什么?
  • TypeScript 押题
    • JS 的区别是什么?有什么优势?
    • any、unknown、never 的区别是什么?
    • TS 工具类型 Partial、Required、Readonly、Exclude、Extract、Omit、ReturnType 的作用和实现?
    • interface 的区别是什么?
Powered by GitBook
On this page
  1. React 押题

DOM diff 算法是怎样的?

Diff算法 | Marvin

Diff算法的核心就是 针对具有相同父节点的同层新旧子节点进行比较,而不是使用逐层搜索递归遍历的方式。时间复杂度为O(n) 。 如何理解? 说白点,就是 当新旧VNode树在同一层具有相同的VNode节点时,才会继续对其子节点进行比较。一旦旧 VNode树同层中的节点在新 VNode树中不存在或者是多余的,都会在新的真实 DOM 中进行添加或者删除。 下面就拿一副图进行解释。 从上面的示例图可以看到, Diff 算法中只会对同一层的元素进行比较,并且必须拥有相同节点元素,才会对其子节点进行比较,其他多余的同层节点都会一律做删除或添加操作。 接下来,我们就从源码角度来看看这过程到底是如何发生的。🤔 当数据发生改变时,set方法会让调用 Dep.notify通知所有订阅者 Watcher,订阅者就会调用 patch 给真实的DOM打补丁,更新相应的视图。 我们依然是从_update 方法入手,看看到底是如何操作的。 每一次更新模板时,都会先将渲染好的新 VNode树保存到实例的_vnode属性上,这样做的目的是为了下一次更新时,能获取到旧 VNode 树进行比较。 针对是否拥有旧的 VNode树,使用__patch__方法执行相应逻辑,也即执行了 patch 过程。 可以看到, 只有在浏览器的环境下才能进行patch过程,而实现 patch的,就是 createPatchFunction 方法,我们接着看下去。 好啦,对于 patch 比较过程,你也应该有了一个大概了解。现在就来简单总结一下上述代码。 当旧VNode树不存在时,直接根据新VNode树创建相应的真实DOM。 当旧VNode树存在时,则会调用sameVnode方法比较当前新旧节点是否相同。 当新旧节点是相同时,会调用patchVnode方法比较新旧节点(过程就是继续比较其子节点,递归下去~)。 当新旧节点是不同时,则会先按照新VNode节点创建新的真实DOM节点,再根据旧VNode节点将相应的真实DOM节点进行删除。 是不是很简单 🤔...那么问题来了,不是说 patch过程是使用 Diff 算法进行比较的吗?怎么还看不到,甭急,下面我会讲到哈。 在上面的总结中,我们是可以看到两个方法,分别是 sameVnode方法和 patchVnode

PreviousVue DOM diff 的区别?NextNode.js 押题

Last updated 3 years ago