所属板块:1. 数据类型与内存机制
记录日期:2026-03-04
更新:持续补充示例
1. JavaScript 的数据类型分类
JS 当前(2026)有 8 种数据类型:
基本(原始)类型(7种,按值存储,不可变):
- undefined
- null
- boolean
- number
- string
- symbol(ES6,用于唯一键)
- bigint(ES2020+,处理大整数,避免精度丢失)
引用类型(统称为 Object):
- Object(普通对象)
- Array、Function、Date、RegExp、Map、Set、WeakMap、WeakSet 等都是 Object 的子类型
记住:基本类型存值,引用类型存地址(指针)。
2. 栈内存与堆内存的区别
| 方面 | 栈(Stack) | 堆(Heap) |
|---|---|---|
| 存储内容 | 基本类型 + 引用类型的地址 | 引用类型实际对象内容 |
| 空间大小 | 较小、固定 | 较大、可动态分配 |
| 访问方式 | 按值访问 | 按引用(地址)访问 |
| 分配方式 | 自动分配与释放 | 需要垃圾回收机制 |
| 生命周期 | 函数执行完自动弹出 | 对象不再被引用时才可能回收 |
示例:
let a = 100; // 栈中存 100
let b = a; // 复制值,b 也存 100,独立
let obj = { x: 1 }; // 栈中存地址(指向堆),堆中存 {x:1}
let obj2 = obj; // 复制地址,obj 和 obj2 指向同一对象
obj2.x = 999;
console.log(obj.x); // 999(共享同一对象)
3. 常见注意点
-
基本类型的值不可变:
let str = "hello"; str[0] = "H"; // 无效 console.log(str); // 仍然 "hello" -
null 和 undefined 的区别(面试常问):
- null:人为设置的“空对象指针”
- undefined:未定义、未初始化
-
Symbol 和 BigInt 的简单使用场景:
-
Symbol:作为对象唯一属性键,避免覆盖
const key = Symbol("id"); obj[key] = 123; // 不会和字符串 "id" 冲突 -
BigInt:处理超过 Number.MAX_SAFE_INTEGER 的整数
const big = 12345678901234567890n; console.log(big + 1n); // 正确计算
-
4. 为什么要把引用类型放在堆里?
因为对象大小不确定、需要动态扩展,栈不适合。栈只适合固定大小、频繁存取的数据。
下一篇文章会继续记录类型检测的几种方法(typeof 的坑、toString.call 的用法等)。
返回总目录:戳这里