1. 声明变量 const 优先原则
在JavaScript中,声明变量一般遵从 const 关键字优先原则。
对于基本数据类型,声明后值发生改变需要用 let 关键字。但对于 Array 数组或 Object 对象等复杂数据类型,即使声明后需要进行增删改变,也仍然可以使用 const 声明,其内在原因在于底层中的数据在内存中的存储方式。
为什么优先使用const?
表达开发者意图:声明的变量不会被重新分配引用。
遵循不可变性(immutability)的理念,有助于代码的可维护性和调试效率。
2. JavaScript 的内存分配
在 JavaScript 中内存分为 Stack 栈 和 Heap 堆 两个部分,其中:
栈(Stack):用于存储基本数据类型的值以及函数调用上下文。
堆(Heap):用于存储复杂数据类型(引用类型)的对象。
3. 基本数据类型在内存中的存储
在 JavaScript 中常见的基本数据类型有:数字类型 number,字符串型 string,布尔型 boolean 等。
栈是一种较为简单的数据结构,可以快速分配和回收内存。在 JavaScript 中这些基本数据类型通常存储在栈中,对于 let 关键字来说,let 声明的变量可以重新赋值,而 const 声明则不能重新赋值(引用类型除外)。
JavaScript 规定 let 关键字声明的变量在作用域内可以被重新赋值,当重新赋值时,值覆盖原地址中的内容,内存地址保持不变。
const 关键字声明的变量在作用域内不能被重新赋值,在定义时必须初始化,并且对于基本数据类型,const 限制变量指向的值和内存地址均不能改变。
4. 复杂数据类型在内存中的存储
JavaScript 中如 Array 数组 和 Object 对象等复合数据类型,在内存中的存储分为栈和堆两部分进行。用 let 和 const 关键字声明后在栈中存储的是堆的引用地址,所以这类数据又被称为引用类型数据。
存储方式:
栈中存储引用地址,指向堆中存储的实际数据。
堆中的数据大小不固定,因此需要通过栈中的引用地址来间接访问。
在 JavaScript 中 let 和 const 关键字声明的引用类型数据在栈中都存储的是堆中的引用地址,所以当我们对其进行增删或重新赋值的操作,改变的都是堆中的内容,而非栈中存储的引用地址。所以使用 const 关键字声明的引用类型数据仍然可以被改变,并且在实际操作中,我们应该遵守其 const 声明优先原则。
对于 let 和 const 关键字:
let:
- 引用地址可以被重新赋值,指向新的堆内存。
- 堆中的数据可以修改。
const:
- 引用地址不能被重新赋值。
- 引用的堆中内容是可变的,可以增删属性或修改值。
注意:
如果需要更换引用地址(如赋值为一个新的对象),应使用 let。
对于只读的数据结构(如冻结的对象或数组),可以配合
Object.freeze()
强化不可变性。
About this Post
This post is written by Tab Yang, licensed under CC BY-NC 4.0.