基本类型存值于栈内存,赋值复制值;引用类型存地址于栈、数据在堆,赋值复制地址。比较时基本类型比值,引用类型比地址。基本类型不可变且不能直接加属性,引用类型可变且可扩展属性。

核心区别在于内存存储方式和赋值行为:基本类型存值,引用类型存地址。
内存位置与访问方式不同
基本类型(number、string、boolean、null、undefined、symbol、bigint)直接存在栈内存里,变量名就指向那个具体的值。比如 let a = 42,a 就是 42 本身。
引用类型(object、array、function、date、regexp等)的实际数据存在堆内存中,变量里只存一个指向堆中位置的“地址”。就像你家门牌号不是房子本身,只是找到房子的线索。
赋值时的行为截然相反
基本类型赋值是“复制一份值”:
-
let x = 100; let y = x;→ y 得到的是 100 的副本 - 改
y = 200,x 还是 100,互不影响
引用类型赋值是“复制一份地址”:
-
let obj1 = {name: 'Alice'}; let obj2 = obj1;→ obj2 和 obj1 指向堆里同一个对象 - 改
obj2.age = 30,再查obj1.age也是 30
比较和修改逻辑也不同
基本类型用 === 比较,看的是值是否相等:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
"hi" === "hi"→ true -
42 === 42→ true
引用类型用 === 比较,看的是是否指向同一块堆内存:
-
{a:1} === {a:1}→ false(两个独立对象) -
let a = {}; let b = a; a === b→ true(同一地址)
基本类型不可变:字符串调用 .toUpperCase() 返回新字符串,原值不变;引用类型可变:能随时增删属性、修改元素。
额外但关键的事实
基本类型不能直接加属性:
-
let s = "abc"; s.foo = 123; console.log(s.foo)→ undefined
引用类型可以自由扩展:
-
let arr = []; arr.custom = "ok"; console.log(arr.custom)→ "ok"
基本类型方法调用(如 "abc".length)靠“临时包装对象”实现,用完即丢,不改变原始值。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










