一,在diff算法上的异同

相同点:
1.虚构DOM在比拟时只比拟同一层级节点,复杂度都为 O(n),升高了算法复杂度。
2.都应用key比拟是否是雷同节点,都是为了尽可能的复用节点。
3.都是操作虚构DOM,最小化操作实在DOM,进步性能(其实虚构DOM的劣势 并不是在于它操作DOM快)。
4.都是不要用 index作为 key。

不同点:
1.diff算法遍历节点方向:
React的是仅向右挪动,Vue2的是双端向两头挪动,Vue3的是在Vue2的根底上减少最长递增子序列的算法优化。

2.diff算法比拟变量:
vue保护四个变量:

oldStartIdx => 旧头索引oldEndIdx => 旧尾索引newStartIdx => 新头索引newEndIdx => 新尾索引

两边方向同时比拟,由新的地位来获取实在DOM;如果老的先走完,就增加;如果新的先走完,就删除
react保护三个变量:

1.nextIndex => 遍历nextChildren时候的index,每遍历一个元素加1 (遍历新节点)2.lastPlacedIndex => 上一次从prevChildren中取出来元素时,这个元素在prevChildren中的index(新节点对应)3.oldIndex => 元素在数组中的地位(旧节点对应的地位)

节点挪动前提是:oldIndex < lastPlacedIndex

挪动的准则:
首个节点(指的是新节点)不执行挪动操作(除非它要被移除),以该节点为原点,其它节点都去寻找本人的新地位;
将原来的元素往右移,通过lastIndex来管制。在lastIndex右边的,就往lastIndex左边挪动;在lastIndex左边的,就不须要动。

nextIndex : 往右遍历,逐步+1
oldIndex:依据nextIndex在旧结点中寻找对应的元素,如果能找到比拟oldIndex和lastPlacedIndex,否则增加
lastPlacedIndex:能够了解为是一个比拟指引,当产生挪动的时候lastPlacedIndex值放弃上一次比拟值,不做挪动应用oldIndex值
oldIndex = 4 > lastPlacedIndex 不做操作,且 lastPlacedIndex = oldIndex = 4
oldIndex = 0 < lastPlacedIndex 挪动, lastPlacedIndex放弃不变

3.diff算法比对形式:
React只比拟节点类型和key,Vue比拟节点类型和key,还有属性