javascript原始类型值直接存于栈内存,非地址或引用,赋值传参比较均按值操作,不可变且无需垃圾回收。

JavaScript 中原始类型(number、string、boolean、null、undefined、symbol、bigint)的值本身直接存放在栈内存中,不是地址,也不是引用——变量里装的就是 42、"hello"、true 这些东西。赋值、传参、比较,全按值操作,不共享内存,也不触发垃圾回收。
原始类型全在栈里,没有例外
七种原始类型全部驻留在栈内存,包括长字符串或大整数。比如 const s = "a".repeat(10000),虽然底层可能有引擎优化(如字符数据放堆),但对开发者而言,它仍是按值语义:不可变、赋值拷贝内容、=== 比较值而非地址。
- 声明
let a = 100,V8 就在当前函数栈帧里分配固定空间,把 100 直接写进去 -
let b = a是复制数值,b拥有独立内存位置,改a不影响b - 哪怕字符串很长,也不会因为长度“自动进堆”;行为上始终是值语义
栈里存的是值,不是指针
这和对象有本质区别:对象变量在栈中只存一个指向堆内存的地址,而原始类型变量在栈中存的就是值本身。你不能通过 str[0] = "x" 修改字符串,不是因为栈不允许改,而是语言规范强制不可变——所有修改操作(如 toUpperCase())都返回新值,原值不动。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
str[0] = "x"静默失败,str仍为原字符串 - 这种不可变性是语义设计,保障纯函数、无副作用等编程模式天然可行
- 它与内存位置无关:即使未来引擎调整存储策略,只要保持按值+不可变,代码行为不变
生命周期由执行上下文自动管理
栈内存和函数调用强绑定。函数开始执行,它的局部原始变量被压入栈;函数返回,整块栈帧自动弹出,变量立即释放——不需要 GC 干预,不会滞留,也不会因闭包意外逃逸(除非被长期捕获,此时引擎会将其提升至堆,但对外仍表现为值)。
-
const只锁定变量绑定,不改变存储位置或内存行为 - 闭包中被引用的原始值可能被移到堆,但这属于引擎优化,开发者无需感知
- 栈空间小(Chrome 约 1–2 MB),适合高频、轻量、生命周期明确的数据
为什么不用堆存原始值?
堆适合生命周期不确定、体积大、结构复杂的对象。原始类型体积小、长度固定(如 number 总是 64 位)、使用极频繁——放栈里能实现纳秒级读写,且与调用栈天然契合。若硬塞进堆,每次函数调用都要复制大量数据,栈空间易溢出,上下文切换成本剧增。
- 系统栈本就用于维护执行流(call stack),顺带存轻量数据,整体开销低
- 原始类型存栈、对象存堆,是性能与灵活性之间的平衡选择
- 你写的每行
let x = 42,只要右边是原始值,它就实实在在躺在栈里,等着被快速读、被干净释放
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










