object.freeze()能提升vue 2性能,因其跳过响应式劫持;适用于纯展示的静态数据,如长列表、配置项、图表数据等,需在赋值前冻结,注意深层嵌套需手动处理。

直接用 Object.freeze() 冻结数据,Vue 2 就不会为它建立 getter/setter,跳过响应式劫持过程,大幅缩短初始化渲染时间。关键前提是:这些数据纯展示、不修改、不依赖响应式更新。
为什么能提升性能?
Vue 2 的响应式系统基于 Object.defineProperty,对 data 中每个属性递归遍历并添加访问器。当数据量大(比如 10 万条用户记录)、嵌套深时,这个 observe 过程非常耗时,甚至比请求本身还慢。而被 Object.freeze() 处理过的对象,Vue 会主动跳过响应式处理,视作静态只读数据。
怎么正确使用?
在赋值给 data 属性前调用 Object.freeze(),确保冻结的是最终要渲染的数据结构:
- 数组:直接冻结整个数组(数组本质是对象)
this.tableData = Object.freeze(response.data); - 对象:冻结整个对象,或先解构再冻结避免污染原始数据
this.config = Object.freeze({ ...apiConfig }); - 注意:冻结的是值,不是引用;后续想更新,只需重新赋值新引用(如再次调用 API 后重新 freeze 新数据)
哪些场景特别适合?
以下情况用 Object.freeze() 效果明显:
- 后台管理系统的长列表(用户表、订单表、日志列表)
- 配置类数据(菜单权限、字典项、地区列表)
- 图表的原始数据源(ECharts/Vue-Chart 数据集)
- 表单详情页的只读展示(如审核记录、历史快照)
注意事项
冻结后数据完全不可变,需避开常见误用:
- 不要在冻结后尝试修改属性,如
data[0].name = 'new'—— 不报错但无效 - 深层嵌套对象需手动逐层 freeze,或配合工具函数(如递归 freeze 工具)
- Vue 3 中响应式机制已改为 Proxy,
Object.freeze不再影响响应式行为,该优化仅适用于 Vue 2 项目 - 与
const无关,const只限制变量重新赋值,不影响对象内部可变性











