javascript中基本类型存栈、引用类型存堆:基本类型(string、number等7种)值直接存栈,赋值复制值;引用类型(object、array等)数据存堆、栈存地址,赋值复制地址,故===比较地址而非内容。

JavaScript 中区分基本数据类型和引用数据类型的存储机制,关键在于它们在内存中的存放位置和访问方式不同——基本类型直接存在栈里,引用类型的数据存在堆里、栈里只存地址。
基本数据类型:值直接存在栈中
字符串(String)、数字(Number)、布尔(Boolean)、undefined、null、Symbol、BigInt 这七种类型,体积小、结构固定,JS 引擎把它们的**实际值**直接写入栈内存。变量名就指向这个值本身。
- 赋值时复制的是值的副本,两个变量互不影响
- 比如
let a = 10; let b = a;,栈中会生成两个独立的10,改b不会影响a - 字符串不可变也是因为栈中值不能被原地修改,任何“修改”操作(如
str.toUpperCase())都返回新字符串,原值保持不变
引用数据类型:真实数据在堆中,栈中只存地址
对象(Object)、数组(Array)、函数(Function)、Date、RegExp、Map、Set 等都属于引用类型。它们结构复杂、大小不固定,所以 JS 把**实际内容**存在堆内存,而变量在栈中只保存一个指向该内容的**内存地址**。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 赋值时复制的是这个地址,多个变量可能指向同一块堆内存
- 例如
let obj1 = {x: 1}; let obj2 = obj1;,obj1和obj2的栈中存的是同一个地址,改obj2.x后,obj1.x也会变 - 用
===比较两个对象,比的是地址是否相同,不是内容是否一样;所以[1,2] === [1,2]是 false
为什么这样设计?栈快堆大,各司其职
栈内存访问快、自动管理(函数执行完就清空),适合放轻量、定长的值;堆内存容量大、由垃圾回收器(GC)管理,适合放体积可变、生命周期不确定的复杂数据。这种分离既保证了性能,又支撑了 JavaScript 的动态特性。
简单说:栈里放得下、改不动的——基本类型;栈里放不下、随时可能变的——引用类型,数据甩到堆里,栈里留个“门牌号”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










