You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Babel中const是否阻止变量突变?附ES6 Jest测试场景

在Babel环境下,const关键字是否会阻止变量的突变?

先给你一个清晰的结论:不管有没有Babel,const都不会阻止变量指向的引用类型(对象、数组这类)的内部突变——它只禁止变量本身被重新赋值。

先搞懂const的核心规则

const的设计初衷是锁定变量的引用指向,而不是锁定引用指向的内容:

  • 如果用const声明的是基本类型(字符串、数字、布尔值等),那确实没法修改它的值,因为基本类型的值是直接存在变量里的,重新赋值就是改变引用,这会被const阻止。
  • 但如果是对象、数组这类引用类型,const只是锁定了变量指向这个对象的内存地址,你完全可以修改对象内部的属性、数组里的元素,这不属于“重新赋值”,所以const不会拦着你。

举个和你代码类似的例子:

// 用const声明对象
const currentUserInfo = { firstName: 'User1', lastName: 'Old Info' };
// 修改内部属性——完全允许,不会报错
currentUserInfo.lastName = 'Updated Info';
// 尝试重新赋值变量——这会报错,不管是原生ES6还是Babel转译后的环境
currentUserInfo = { firstName: 'New User' };

Babel转译后的表现

Babel会把ES6的const转译成ES5的代码,通常会自动加上严格模式("use strict")。在严格模式下,如果你尝试给转译后的“const变量”(实际是var声明的)重新赋值,浏览器会抛出TypeError,和原生ES6的行为一致。

但对于引用类型的内部修改,转译前后没有任何区别——你依然可以自由修改对象的属性、数组的元素,这完全不受const或Babel的限制。

回到你的测试代码

你代码里的currentUserInfo、mockSessionData都是对象类型,用const声明完全没问题:你可以放心修改它们的内部属性(比如更新user的信息),这不会被阻止;但不要尝试直接给这些变量重新赋值,否则不管是在原生ES6环境还是Babel转译后的环境,都会触发错误。

内容的提问来源于stack exchange,提问作者Geraldo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:26:46