Sep 25, 2024
try...catch
只能捕捉到同步执行代码块中的错误例子
1、异步方法情况
javascripttry { setTimeout(() => { throw new Error('err') }, 200); } catch (err) { console.log(err); } <--正确方案--> new Promise((resolve, reject) => { setTimeout(() => { try { throw new Error('err'); } catch (err) { reject(err); } }, 200); }) .then(() => { // 正常执行时的处理逻辑 }) .catch((err) => { console.log(err); // 这里会捕捉到错误 });
2、promise链下
javascripttry { Promise.resolve().then(() => { throw new Error('err') }) } catch (err) { console.log(err); } <--正确方案--> // 方法一 Promise.resolve() .then(() => { throw new Error('err'); }) .catch((err) => { console.log(err); // 这里会捕捉到错误 }); // 方法二 async function handleError() { try { await Promise.resolve().then(() => { throw new Error('err'); }); } catch (err) { console.log(err); // 这里会捕捉到错误 } } handleError();
使用了函数劫持的方式,重写了数组的方法,Vue将data中的数组进行了原型链重写,指向了自己定义的数组原型方法。这样当调用数组api时,可以通知依赖更新。如果数组中包含着引用类型,会对数组中的引用类型再次递归遍历进行监控。这样就实现了监测数组变化。
Vue.js 是一个流行的 JavaScript 框架,用于构建用户界面。在 Vue 的两个主要版本(Vue 2.x 和 Vue 3.x)中,虚拟 DOM(Virtual DOM)和其 diff 算法是非常重要的特性。diff 算法用于高效地更新 DOM,保持界面和状态的一致。下面我们来详细探讨一下这两个版本中的 diff 算法。
Vue 2.x 使用的是基于 Snabbdom 的 diff 算法,主要特点如下:

具体的算法步骤可以概述为:
Vue 3.x 进行了大量的重构,引入了全新的编译器和运行时,其中 diff 算法也得到了显著改进。主要特点如下:
patchFlag
)来标记哪些部分需要更新,从而减少不必要的比较。具体的算法步骤可以概述为:
patchFlag
)和节点类型(组件、文本、元素等)进行不同的处理。假设有如下虚拟 DOM 结构:
html<ul> <li key="a">A</li> <li key="b">B</li> <li key="c">C</li> <li key="d">D</li> </ul>
我们将其更新为:
html<ul> <li key="b">B</li> <li key="a">A</li> <li key="d">D</li> <li key="c">C</li> </ul>
Vue 2.x 的算法会逐一比较每个节点:
<li key="a">
和 <li key="b">
,不同。<li key="d">
和 <li key="c">
,不同。Vue 3.x 的算法会利用静态标记和最长递增子序列算法:
<ul>
,相同。<li key="b">
和 <li key="a">
需要交换位置,但不需要重新创建。Vue 2.x 和 Vue 3.x 的 diff 算法在基本原理上相似,但 Vue 3.x 进行了更深入的优化,特别是在静态标记和节点移动方面,大大提高了性能和效率。这使得 Vue 3.x 在处理大型应用时,能够更加高效地更新 DOM,提升用户体验。
new Set
根据对象某个key去重 [...new Map(arr.map(i=>[i.key,i])).values]