295 - 《const 和不可变性》

发布于 2023年5月6日

接着 The “const” Deception 这篇文章扩展下,补充下 JavaScript 基础知识。

1、const 声明的变量就不可变吗?不是。const 只是阻止了变量被重新赋值,但不能阻止变量指向的非原始类型的值发生变化。

可以阻止变量 a 被重新赋值。

const a = 1;
a = 2; // 这里会报错

但当 a 指向非原始类型时,值是可以变更的。

const a = { b: 1 };
a.b = 2;
console.log(a); // { b: 2 }

2、那如何阻止上述场景发生变化?有几种方法,1)Object.freeze,2)TypeScript 的 as const 。

3、先看 Object.freeze。他可以阻止非原始类型的值被修改。

const a = { b: 1 };
Object.freeze(a);
a.b = 2;
console.log(a); // { b: 2 }

一些 Tips。

1)被修改时不会报错,只是静默的保持原始值,除非你开了严格模式,此时会抛 TypeError。

const a = { b: 1 };
Object.freeze(a);
(() => {
	'use strict';
	a.b = 2;
})();
console.log(a);

2)Freeze 是 Shadow 的,不是 Deep 的。

const a = { b: 1, c: { d: 1 } };
Object.freeze(a);
a.b = 2;
a.c.d = 2;
console.lo

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。