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
相关产品推荐
相关产品推荐

