January 5, 2025

JavaScript:为什么声明可变的引用类型也可以使用 const 优先原则?

1. 声明变量 const 优先原则

在JavaScript中,声明变量一般遵从 const 关键字优先原则。

对于基本数据类型,声明后值发生改变需要用 let 关键字。但对于 Array 数组或 Object 对象等复杂数据类型,即使声明后需要进行增删改变,也仍然可以使用 const 声明,其内在原因在于底层中的数据在内存中的存储方式。

为什么优先使用const?

2. JavaScript 的内存分配

在 JavaScript 中内存分为 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.

#note#web#js