isProxy 用于判断对象是否为 reactive、readonly 或 shallowReactive 创建的 Proxy 响应式代理,对 ref、computed、toRef 等返回对象返回 false;它仅检测 Proxy 实例,不等价于“是否响应式”,需结合 isReactive、isReadonly、isRef 综合判断。

isProxy 是 Vue 3 提供的一个工具函数,用于判断一个对象是否是由 reactive、readonly 或 shallowReactive 等创建的响应式代理对象。它不适用于 ref(因为 ref 返回的是一个带 .value 的普通对象,不是 Proxy),也不适用于通过 toRef、computed 等返回的包装对象。
isProxy 的基本用法
它接收一个参数,返回布尔值:
- 如果是
reactive({})、readonly({})、shallowReactive({})创建的对象,返回true - 普通对象、
ref、computed、toRef、数组字面量、null、undefined 等都返回false
示例:
import { reactive, readonly, isProxy } from 'vue'
const obj = {}
const proxy = reactive({})
const roProxy = readonly({})
console.log(isProxy(obj)) // false
console.log(isProxy(proxy)) // true
console.log(isProxy(roProxy)) // true
console.log(isProxy(reactive([]))) // true(数组也适用)
注意 ref 不是 Proxy,不能用 isProxy 判断
ref 返回的是一个普通对象(形如 { value: ... }),内部用 Object.defineProperty 或 Proxy(仅当启用 __DEV__ 且开启严格模式时)实现响应性,但 它本身不是 Proxy 实例,所以:
立即学习“前端免费学习笔记(深入)”;
isProxy(ref(1)) === false-
isProxy(ref({}).value) === false(.value是原始对象,非代理) - 若想检测 ref 的值是否为代理,需检查
ref.value,而非 ref 本身
常见误判场景与替代方案
实际开发中,你可能真正想问的是:“这个数据是不是响应式的?”——但 isProxy 只回答“是不是 Proxy”,并不等价于“是否响应式”。例如:
-
shallowRef({})的.value是普通对象,isProxy(shallowRef({}).value) === false,但它仍是响应式(修改 .value 会触发更新) -
markRaw({})包裹的对象不会被转为 proxy,isProxy返回 false,这是预期行为
如果目标是判断“是否具有响应性”,没有官方 API 直接支持,可结合:isReactive()(判断是否由 reactive 创建)、isReadonly()(判断是否只读代理)、isRef()(判断是否为 ref)来综合判断。
在 setup 或组合函数中安全使用
可在任意同步上下文调用,包括 setup()、onMounted、普通函数中。无需担心副作用或生命周期限制:
- 它只是做
instanceof Proxy检查,开销极小 - 不要在模板中频繁调用(虽无错,但没必要)
- 避免用于用户输入或第三方对象判断——只有 Vue 明确创建的响应式对象才应被此函数识别


















