在 js 中对数据的存储主要有两种形式:栈内存、堆内存。
栈内存:主要负责存储基本数据类型的变量,包括Boolean、Number、String、Undefined、Null,**以及对象变量的指针。就像一个线性排列空间,每个数据的单元格大小都一样。
堆内存:主要负责 Object 对象的存储。
图1 栈内存与堆内存
引出问题
Q:const 定义的常量完全不能更改吗?
A:const 定义的若是基本数据类型的常量,是无法更改的。但是,const 定义的若是 Object 对象,则是可以更改的。
原因:
图2 const 定义基本数据类型常量
图3 const 定义 Object 对象
代码如下:
const num = 1;
num = 2; // 报错:Uncaught TypeError: Assignment to constant variable.
const person = {};
console.log(person); // {}
person.name = '张三';
console.log(person); // {name: "张三"}
console.log(person.name); // 张三
person.name = '李四';
console.log(person); // {name: "李四"}
console.log(person.name); // 李四
如果你定义了 Object 变量后,也不想改变其中定义好的属性的值,可以使用如下方法:
Object.freeze(person); // 冻结变量
person.name = '李四';
console.log(person); // {name: "张三"}
console.log(person.name); // 张三
同样的,对 const 定义的数组进行修改也不被视为对常量的修改。
const arr = [1, 2, 3, 4];
console.log(arr); // [1, 2, 3, 4]
arr[4] = 5;
console.log(arr); // [1, 2, 3, 4, 5]
arr.push(6);
console.log(arr) // [1, 2, 3, 4, 5, 6]
arr.pop();
console.log(arr); // [1, 2, 3, 4, 5]