原始类型在const下真·不可变,因其值直接存于栈内存地址中,const锁死该地址内容;而引用类型仅锁栈中地址,不控堆中数据。

原始类型在 const 声明下“不可变”,本质是它所绑定的栈内存地址里的值被锁死——因为值就存在那个地址里,改值 = 改地址内容,而 const 禁止这种修改。
原始类型的值和地址是一体的
Number、String、Boolean、null、undefined、Symbol、BigInt 这些原始类型,数据直接存储在栈内存中。变量名(比如 const count = 42)不是指向别处的指针,它本身就在栈上占一个固定位置,里面存的就是 42 这个值。
- 栈内存像一排编号格子,
count就是第 105 号格子,里面写着42 -
const的作用,就是把第 105 号格子焊死:不允许往里写新数字、新字符串 - 所以
count = 43报错,不是“不能换对象”,而是“不许擦掉格子里的字再写别的”
没有“指向”,也就没有“换指向”这回事
原始类型不存在“引用”或“地址指向另一块内存”的概念。它不像对象那样在栈里存个地址、再让这个地址指向堆里的大块数据。因此:
- 你没法用原始类型做“浅层冻结”或“深层冻结”——它天生就是单层、无嵌套、无引用的
-
const对它的限制是完整且彻底的:地址不可换 + 值不可改 = 真·不可变 - 这也解释了为什么原始类型可以安全地用于
case分支、Map键、React.memo比较——它们的相等性是值相等,且值不会偷偷变
对比引用类型,更能看清这个“一体性”
如果声明的是 const user = { name: 'Alice' },栈里存的是一个地址(比如 0xabc),真正的 { name: 'Alice' } 在堆里。此时 const 只锁住栈中那个 0xabc,不碰堆里内容。
- 原始类型:栈中格子 = 值本身 → 锁格子 = 锁值
- 引用类型:栈中格子 = 地址 → 锁格子 = 锁地址,不管堆里那块地干啥
- 所以“
const不可变”对原始类型是结果,对引用类型只是手段
说到底,原始类型的 const 不可变性,是它“值即地址、地址即值”的存储特性与 const 绑定机制自然叠加的结果。










