JavaScript 基本类型与引用类型的核心区别解析
本文详细解析 JavaScript 中基本类型(如 String、Number)与引用类型(如 Object、Array)的区别。重点阐述两者在内存存储(栈区与堆区)、值可变性及访问比较方式上的差异,并深入探讨克隆操作中浅克隆与深克隆对内存地址的影响,帮助开发者理解 JS 类型系统的底层逻辑。
简单概述
在 JavaScript 中,变量主要被划分为两种不同的数据类型:
- 基本类型包括:undefined、null、Boolean、Number、String 以及 ES6 引入的 Symbol。
- 引用类型则指除基本类型以外的所有类型,通常可理解为对象,例如:Object、Array、RegExp、Date、Function 等。
这两类类型的核心区别主要体现在以下几个方面:
| 基本类型 | 引用类型 | |
|---|---|---|
| 可变性 | 不可变 | 可变 |
| 存储区 | 栈区 | 栈区和堆区 |
| 访问 | 按值访问 | 按引用访问 |
| 两者比较 | 值的比较 | 引用的比较 |
详细说明
值的可变性
以 string 类型为例,基本类型的值是不可变的。
let person = '小明';
person.age = 18;
console.log(person.age); // undefined
相比之下,引用类型的值(原始值)允许添加属性和方法。
let person = { name: '小落子' };
person.age = 18;
person.addAge = function() {
person.age2 = person.age + 1;
}
person.addAge();
console.log(person.age, person.age2); // 18 19
这一特性表明,基本类型的值一旦创建便不可改变,而引用类型的值则是可变的。
存储
基本类型的存储结构如下:
| 栈区 | 栈区 |
|---|---|
| name | 小红 |
| age | 18 |
基本类型的变量存储在栈区(stack),即内存中的栈内存区域。
栈区中保存了变量的标识符以及变量具体的值。
引用类型的存储结构如下:

引用类型的存储涉及内存的栈区和堆区(heap,即堆内存)共同协作。
栈区保存变量的标识符以及指向堆内存中对象的指针(即对象在堆内存中的地址),而实际的对象数据则保存在堆区。
访问/比较
// 基本类型,以string为例
let a = '[]', b = '[]';
console.log(a === b); // true
// 引用类型
let c = [], d = [];
console.log(c === d); // false
基本类型的访问是按值进行的;而引用类型则是按引用(即地址)进行访问。
在比较时,基本类型比较的是值,若值相同则结果为 true;引用类型比较的是两个对象在堆内存中的地址是否相同。尽管变量 c 和变量 d 都是空数组,但它们的堆内存地址不同,指向的不是同一个数组对象,因此它们不相等。

经常遇到的问题
在基本类型和引用类型的应用及面试中,克隆(复制)是一个常见问题,这引出了深克隆和浅克隆的概念(这对基本类型没有影响)。
- 浅克隆:在复制引用类型时,不仅复制了值,还复制了内存地址;因此修改其中一个对象,另一个也会随之变化。
- 深克隆:复制后内存地址不同;修改其中一个对象,另一个不会发生相应改变。
到此这篇关于 Javascript 中的基本类型和引用类型概述说明的文章就介绍到这了,更多相关 JS 基本类型与引用类型内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
JS中将数组和对象混合组装为JSON字符串
2026-11-05 16:41:42
JS运算符优先级与结合性的区别是什么?
2026-11-05 13:22:02
JS Map怎么只遍历Key或Value
2026-11-05 13:00:36
D3.js 与 ECharts 选型对比:灵活性 vs 开发效率
2026-11-05 09:45:01
为什么JS中typeof []返回object:数组类型检测误区解析
2026-11-04 19:50:47
