原始值直接存栈中,引用值的地址存栈、真实数据存堆中;原始类型(如number、string)值固定、按值访问;引用类型(如object、array)大小不一、按引用访问,赋值复制地址而非对象本身。

原始值存在栈里,引用值的地址在栈里、真实数据在堆里——这是理解 JS 内存模型最核心的一句话。
原始值:值直接存栈中,谁用谁有份
像 number、string、boolean、null、undefined、symbol、bigint 这些,体积小、结构固定,JS 直接把它们的值存在栈内存里。变量名就等于那个值本身。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 赋值时复制的是值的完整副本,两个变量互不干扰
- 修改其中一个,另一个完全不受影响
- 栈内存自动管理,速度快,但空间有限
引用值:栈里只存“门牌号”,真家伙全在堆里
Object、Array、Function、Date 等类型,结构复杂、大小不定,JS 把它们的实际内容存在堆内存中;而栈里只存一个指向堆中位置的地址(就像快递单号)。
- 赋值时复制的是这个地址,不是对象本身
- 多个变量可能指向同一个堆内存对象,改一个,其他都看到变化
- 堆内存动态分配,空间大但访问慢,靠垃圾回收机制清理
为什么这样设计?性能和灵活性的平衡
栈快但小,适合放轻量、确定大小的数据;堆大但慢,适合放可变、结构复杂的对象。JS 把原始值全塞进栈,既保证访问效率,又避免栈溢出;把引用值本体挪到堆,让栈保持清爽,同时支持对象动态增删属性、数组随意 push —— 这种分工是运行时自动完成的,开发者无需手动干预。
一个典型例子看清区别
let a = 10;
let b = a;
b = 20;
console.log(a); // 10 → 原始值,各管各的
let obj1 = { x: 1 };
let obj2 = obj1;
obj2.x = 99;
console.log(obj1.x); // 99 → 引用值,共用一份数据
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










