ECMAScript集合引用类型

Object、Array、Map、Set、WeakMap、WeakSet 与定型数组的分工概览。

#type / concept #status / growing #resource / javascript #resource / ecmascript

[!info] related notes

ECMAScript集合引用类型

集合引用类型关注的是“如何组织多项数据”。和 DateRegExp 这类单体对象相比,它们更像容器。

常见成员

  • Object
  • Array
  • Typed Array / ArrayBuffer / DataView
  • Map / WeakMap
  • Set / 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

定型数组属于什么位置

定型数组相关类型更偏底层二进制数据处理,常见于音视频、图形、协议解析和高性能数值处理。

常见类型:Int8ArrayUint8ArrayFloat32ArrayFloat64Array 等。

选择决策树

需要存储数据?
├── 键值对?
│   ├── 键是对象?→ WeakMap
│   ├── 键是任意类型 + 频繁增删?→ Map
│   └── 键是字符串 + 结构固定?→ Object
├── 唯一值集合?
│   ├── 值是对象 + 需要弱引用?→ WeakSet
│   ├── 需要集合运算?→ Set
│   └── 需要按索引访问?→ Array
└── 有序列表?
    └── Array

两组最常见比较

  • Object vs Map: 一个偏对象属性模型,一个偏通用键值容器
  • Array vs Set: 一个保留位置与重复项,一个强调唯一值集合

延伸阅读

创建于 2025/1/1 更新于 2026/5/27