核心区别在于内存存储方式和操作行为:原始类型存值于栈,引用类型存地址于栈而值在堆;赋值时原始类型复制值、引用类型复制地址;比较时原始类型比值、引用类型比地址;原始类型不可变、引用类型可变;typeof对null返回"object"是历史bug。

核心区别在于内存存储方式和操作行为:原始类型存值,引用类型存地址。
存储位置与内容不同
原始类型(如 number、string、boolean、null、undefined、symbol、bigint)直接把值存在栈内存里;引用类型(如对象、数组、函数、日期等)的值存在堆内存中,变量在栈里只保存一个指向堆中数据的地址。
- 栈内存空间小、读写快,适合存固定大小的简单值
- 堆内存空间大、管理复杂,适合存可变长度的复合结构
赋值时的行为不同
原始类型赋值是“复制值”,两个变量互不影响;引用类型赋值是“复制地址”,多个变量指向同一块堆内存。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 原始类型示例:let a = 10; let b = a; b = 20; → a 还是 10
- 引用类型示例:let obj1 = {x: 1}; let obj2 = obj1; obj2.x = 99; → obj1.x 也变成 99
比较方式和可变性不同
原始类型用 === 比较的是值是否相等;引用类型比较的是地址是否相同,即是不是同一个对象。原始类型的值本身不可被修改(比如字符串不能改某个字符),只能重新赋值;引用类型的内容可以随时增删改属性或元素。
立即学习“Java免费学习笔记(深入)”;
- console.log("a" === "a"); // true(值相同)
- console.log({} === {}); // false(地址不同)
- const arr = [1]; arr.push(2); // 合法,内容可变
typeof 判断有特殊表现
用 typeof 可以区分大部分类型,但有个经典例外:typeof null 返回 "object",这是历史遗留 bug。另外,函数虽然属于引用类型,但 typeof function(){} 返回 "function",方便识别。
- typeof 42 → "number"
- typeof null → "object"
- typeof [] → "object"
- typeof function(){} → "function"

















