📚前端面试题速记
Q1

如何理解 Vue 3 的响应式系统?Vue3 使用基于 Proxy 更快了吗?

速记答案(30 秒)

核心:reactive/readonly/ref/computed/watch/watchEffect + effect 依赖收集 + trigger 通知更新。Proxy 懒代理:访问属性时才做拦截,初始化更快,天然支持嵌套对象 & 数组的响应式。

📖 详细讲解

标准面试回答(推荐记住)

Vue 3 的响应式系统基于 Proxy 实现,核心包括 reactive、ref、computed、watch 等 API。相比 Vue 2 的 Object.defineProperty,Proxy 是"懒代理"——只在访问属性时才做拦截,所以初始化更快。另外,Proxy 天然支持新增/删除属性和数组索引变更,不需要像 Vue 2 那样手动调用 $set。

Proxy vs Object.defineProperty

Vue 2 的局限性:
• 无法检测属性的添加或删除
• 无法监听数组索引变化
• 需要递归遍历所有属性,初始化开销大

Vue 3 Proxy 优势:
• 懒代理:只在访问时才代理嵌套对象
• 原生支持新增/删除属性
• 支持数组索引和 length 变化
• 支持 Map、Set、WeakMap、WeakSet

核心 API 对比

API 用途 特点
reactive 对象/数组 深度响应式
ref 任意类型 需要 .value
computed 计算属性 惰性求值+缓存
watch 监听变化 显式依赖
watchEffect 副作用 自动收集依赖

面试要点

  • 理解 Proxy 相比 Object.defineProperty 的优势
  • 能解释"懒代理"带来的性能提升
  • 知道 reactive 和 ref 的区别与适用场景

💻 代码示例

响应式系统基础用法
import { reactive, ref, computed, watch } from 'vue'

// reactive 用于对象
const state = reactive({
  count: 0,
  user: { name: 'Vue' }
})

// ref 用于基本类型
const count = ref(0)

// computed 计算属性
const double = computed(() => count.value * 2)

// watch 监听变化
watch(count, (newVal, oldVal) => {
  console.log(`count: ${oldVal} -> ${newVal}`)
})
Proxy 响应式原理演示(可交互)
🎨 效果预览