获得徽章 12
- 这是在讶羽大佬的群里问 AI 的回答,就目前来说在专业知识领域,AI 还是在胡说八道。
我对这个 “为什么 React 的 Diff 算法不采用 Vue 的双端对比算法?” 问题再次作了一个小小的总结:
Vue2、Vue3 的 Diff 都有双端对比,都是两边往中间靠拢,Vue2 多两个首尾,和尾首的比较,剩下的部分 Vue2 和 Vue3 的处理就不一样了,剩下的部分 Vue3 就采用最长递增子序列算法处理,Vue2 则是暴力地一个一个处理。
React 的 Fiber 是一个单向链表结构,简单来说,就是只能从左往右处理,先处理简单的情况,处理完了,剩下的部分跟 Vue2 一样,也是暴力地一个一个地处理。
在这个过程,key 除了用来比较新旧节点是否相同之外,还有一个重要的作用,无论 Vue2、Vue3 还是 React 在处理完简单的部分之后,剩下的复杂部分,都是通过 key 来进行以空间换时间的操作,如果没设置 key ,则需要O(N²)的时间复杂度,有了 key 之后,就单单确定新老节点这一环节的时间复杂度直接变成了 O(1)。
此外,Vue 和 React 的 diff 都是自上而下,深度优先,我以前也曾在掘金上写过一篇文章专门探讨过这个问题。
本人水平有限,如有错漏,欢迎各路大神斧正。
文章地址:juejin.cn
展开评论5
![[偷笑]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_20.7a46372.png)
![[微笑]](http://lf-web-assets.juejin.cn/obj/juejin-web/xitu_juejin_web/img/jj_emoji_1.7d9f699.png)
)