一、JavaScript数据类型的核心分类
JavaScript的数据类型分为值类型(基本类型)和引用类型(复杂类型),它们的存储方式、操作逻辑及内存管理机制截然不同,深刻理解二者差异是优化代码性能和避免Bug的关键。
1. 值类型(Primitive Types)
- 特点:按值访问,直接存储在栈内存中,赋值时复制值本身,修改互不影响。
- 具体类型:
Undefined:变量未赋值的默认状态(如let a;)。Null:明确赋值的空值,常用于释放对象引用。Boolean、Number、String:布尔值、数字(含浮点数)和不可变字符串。Symbol(ES6):唯一标识符,用于对象属性键。
2. 引用类型(Reference Types)
- 特点:按引用访问,数据存储在堆内存中,变量仅保存内存地址的引用,赋值时共享同一对象。
- 常见类型:
Object:键值对集合(如{name: 'John'})。Array、Function、Date、RegExp等。
二、内存存储机制:栈与堆的较量
1. 值类型的栈内存存储
- 存储方式:直接存储值本身,内存分配高效且固定。
- 示例:
let a = 10;
let b = a; // 复制值,a和b独立
b = 20;
console.log(a); // 10(不受影响)
2. 引用类型的堆内存存储
- 存储方式:变量在栈中存储对象的堆内存地址,实际数据在堆中动态分配。
- 示例:
let obj1 = { value: 10 };
let obj2 = obj1; // 复制引用地址,指向同一对象
obj1.value = 20;
console.log(obj2.value); // 20(同步修改) - 内存泄漏风险:若未手动释放或依赖垃圾回收机制,可能造成堆内存堆积。
三、函数参数传递的底层逻辑
1. 值类型参数传递
- 行为:传递值的副本,函数内修改不影响外部变量。
function modify(num) {
num = 100;
}
let x = 10;
modify(x);
console.log(x); // 10
2. 引用类型参数传递
- 行为:传递内存地址的引用,函数内修改会同步到外部对象。
function update(obj) {
obj.name = "Lucy";
}
let person = { name: "John" };
update(person);
console.log(person.name); // "Lucy"
![]() |
Austin Liu 刘恒辉
Project Manager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢迎收藏和转载此博客中的博文,但是请注明出处,给笔者一个与大家交流的空间。谢谢大家。 |




浙公网安备 33010602011771号