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