基本类型直接存值在栈中,引用类型在栈存地址、在堆存实际对象。因基本类型体积固定、结构简单,适合栈的快速访问;引用类型大小不一,需堆的大容量存储,栈中仅存轻量地址实现高效共享。

基本类型直接存值,引用类型存地址——这是理解栈与堆分工的关键。
为什么基本类型放栈里
基本类型(Number、String、Boolean、null、undefined、Symbol、BigInt)体积固定、结构简单。比如数字 42 总是占 8 字节,字符串 "a" 在 JS 引擎内部也有确定的表示方式。栈内存的特点是空间小、访问快、后进先出,适合存放这类“短平快”的数据。变量名就像一个标签,直接贴在栈里那个具体的值上,读写一步到位。
- 赋值时:var a = 100; var b = a; → 栈中开辟两个独立位置,各自存一份 100
- 修改时:b = 200; → 只改 b 对应的栈位置,a 不受影响
为什么引用类型要分开放
对象、数组、函数这些类型大小不固定:一个空对象可能几字节,一个嵌套 10 层的 JSON 可能几十 KB。如果全塞进栈,会快速撑爆栈空间,还拖慢访问速度。所以 JS 把“实际内容”扔进大而松散的堆内存,只在栈里留一个轻量级的“门牌号”(即内存地址)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 创建时:var obj1 = {x: 1}; → 堆中分配一块区域存 {x: 1},栈中 obj1 存它的地址(比如 0xabc123)
- 赋值时:var obj2 = obj1; → 栈中新开一块,复制的是 0xabc123,不是整个对象
- 结果就是:obj1 和 obj2 指向堆中同一块内存,改一个,另一个立刻可见
栈和堆不是物理隔离,而是逻辑分工
现代 JS 引擎(如 V8)对内存管理做了大量优化,比如小对象可能被分配在栈上(逃逸分析后),但对外行为保持一致:基本类型表现得像“一人一份”,引用类型表现得像“多人共用一本笔记”。你不需要手动干预存放位置,但必须清楚——值是否共享,取决于它是直接存值,还是存地址。
立即学习“Java免费学习笔记(深入)”;
这正是 typeof、===、Object.is、深浅拷贝、函数参数修改等行为差异的底层原因。

















