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

核心区别在于内存存储方式和操作行为:原始类型存值,引用类型存地址。
存储位置与内容不同
原始类型(如 number、string、boolean、null、undefined、symbol、bigint)直接把值存在栈内存里;引用类型(如对象、数组、函数、日期等)的值存在堆内存中,变量在栈里只保存一个指向堆中数据的地址。
- 栈内存空间小、读写快,适合存固定大小的简单值
- 堆内存空间大、管理复杂,适合存可变长度的复合结构
赋值时的行为不同
原始类型赋值是“复制值”,两个变量互不影响;引用类型赋值是“复制地址”,多个变量指向同一块堆内存。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 原始类型示例:let a = 10; let b = a; b = 20; → a 还是 10
- 引用类型示例:let obj1 = {x: 1}; let obj2 = obj1; obj2.x = 99; → obj1.x 也变成 99
比较方式和可变性不同
原始类型用 === 比较的是值是否相等;引用类型比较的是地址是否相同,即是不是同一个对象。原始类型的值本身不可被修改(比如字符串不能改某个字符),只能重新赋值;引用类型的内容可以随时增删改属性或元素。
- 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"
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










