ECMAScript集合引用类型
Object、Array、Map、Set、WeakMap、WeakSet 与定型数组的分工概览。
#type / concept
#status / growing
#resource / javascript
#resource / ecmascript
[!info] related notes
ECMAScript集合引用类型
集合引用类型关注的是“如何组织多项数据”。和 Date、RegExp 这类单体对象相比,它们更像容器。
常见成员
ObjectArray- Typed Array /
ArrayBuffer/DataView Map/WeakMapSet/WeakSet
先建立几个选择直觉
Object
适合结构化字段和对象属性访问语义。
Array
适合有顺序的数据列表。
Map
适合键类型更灵活、插入顺序明确、增删查较频繁的键值对场景。
继续看:Map, Map vs WeakMap
Set
适合去重和成员存在性判断。
继续看:Set, Set vs WeakSet
WeakMap / WeakSet
适合把对象作为弱引用键或成员,常见于缓存、私有元数据等不希望阻止垃圾回收的场景。
继续看:WeakMap, WeakSet, Map vs WeakMap, Set vs WeakSet
Object 常用方法
静态方法
| 方法 | 作用 |
|---|---|
Object.keys(obj) | 返回可枚举属性名数组 |
Object.values(obj) | 返回可枚举属性值数组 |
Object.entries(obj) | 返回 [key, value] 数组 |
Object.fromEntries(iterable) | 从键值对创建对象 |
Object.assign(target, ...sources) | 合并对象(浅拷贝) |
Object.create(proto, props?) | 以指定原型创建对象 |
Object.defineProperty(obj, prop, desc) | 定义属性描述符 |
Object.freeze(obj) | 冻结对象(浅冻结) |
Object.seal(obj) | 密封对象(不能增删属性) |
Object.keys(obj) | 返回可枚举属性名数组 |
Object.hasOwn(obj, prop) | 检查自身属性(ES2022) |
Object.entries(obj) | 返回 [key, value] 数组 |
实例方法
| 方法 | 作用 |
|---|---|
.hasOwnProperty(prop) | 检查自身属性(旧方法) |
.toString() | 返回 "[object Object]" |
.valueOf() | 返回对象本身 |
常用模式
// 遍历对象
for (const [key, value] of Object.entries(obj)) { }
// 浅拷贝
const copy = { ...obj };
const copy2 = Object.assign({}, obj);
// 合并对象
const merged = { ...defaults, ...userConfig };
// 对象转 Map
const map = new Map(Object.entries(obj));
// Map 转对象
const obj = Object.fromEntries(map);
Map / Set / WeakMap / WeakSet
- Map - 通用键值对容器
- WeakMap - 对象弱引用键值对容器
- Set - 唯一值集合
- WeakSet - 对象弱引用集合
- Map vs WeakMap - 通用键值对与对象元数据的区别
- Set vs WeakSet - 唯一集合与对象临时标记的区别
怎么选
- 需要遍历、统计或任意键类型 -> Map
- 需要对象元数据且不想阻止回收 -> WeakMap
- 需要唯一值和集合运算 -> Set
- 需要对象临时标记且不想阻止回收 -> WeakSet
定型数组属于什么位置
定型数组相关类型更偏底层二进制数据处理,常见于音视频、图形、协议解析和高性能数值处理。
常见类型:Int8Array、Uint8Array、Float32Array、Float64Array 等。
选择决策树
需要存储数据?
├── 键值对?
│ ├── 键是对象?→ WeakMap
│ ├── 键是任意类型 + 频繁增删?→ Map
│ └── 键是字符串 + 结构固定?→ Object
├── 唯一值集合?
│ ├── 值是对象 + 需要弱引用?→ WeakSet
│ ├── 需要集合运算?→ Set
│ └── 需要按索引访问?→ Array
└── 有序列表?
└── Array
两组最常见比较
ObjectvsMap: 一个偏对象属性模型,一个偏通用键值容器ArrayvsSet: 一个保留位置与重复项,一个强调唯一值集合
延伸阅读
- 数组专题:javascript-array
- 迭代协议:ecmascript-iterators-and-generators
- Map / WeakMap 对比:Map vs WeakMap
- Set / WeakSet 对比:Set vs WeakSet