Object.defineProperty和Proxy区别
vue2使用Object.defineProperty劫持每个属性,生成getter和setter,属性下还有属性的会递归操作,读取数据的时候调用属性的getter,设置属性的时候调用setter,会有一个缺陷就是值是引用类型时候,改变数据不能及时更新到视图上,所以vue2开放了 delete两个解决这问题
vue3使用es6的proxy,proxy本身效率上就比Object.defineProperty要快,不用递归遍历所有的属性,而且代理是动态的读取数据,当访问某个属性的时候,动态的读取和设置,所以速度非常快。同时Proxy可以监测到成员的新增和删除,所以新增删除成员都可以重新渲染
for循环key的作用
key的作用是更高效的更新虚拟dom
比如当前有[a,b,c,d,e]五个虚拟dom,要更新成[a,b,f,c,d,e]
无论有没有key,前面渲染a,b节点是一样的,没有key的情况下,见到元素就渲染,用f覆盖c渲染出来,最后没有e,会追加创建一个e渲染出来,
有key的情况下,会对比更新,发现新数组突然多出来一个f,(就会判断尾部新老数组同时存在的元素,然后将它们更新出来),就会更新e,之后更新d,c,此时老数组已经空了,就会创建一个f,然后把他插入到指定的位置
使用key虽然执行次数是一样的,但是算法其实是没有执行的,时间和空间的效率更高