2022-09-15 03:35:27

Set

用来存放不重复的数据

传入一个可迭代对象,它的所有元素将不重复地被添加到新的 Set 中。如果值为 null 或者不传递参数,那新的 Set 为空。

内部使用 Object.is 进行值比较,+0-0 视作相同的值

不支持通过下标访问

API

  • add(value):添加新元素,返回 Set 实例本身(支持链式调用)
  • has(value):检测元素是否存在,返回布尔值
  • delete(value):删除指定元素,返回是否删除成功的布尔值
  • clear():清空所有元素,无返回值
  • size:属性,获取元素数量

example

const set = new Set([1, 2, 2, 3, 3])
console.log(set) // Set(3) { 1, 2, 3 }
console.log(set.size) // 3
console.log(set.has(2)) // true
console.log(set.add(4)) // Set(4) { 1, 2, 3, 4 }
console.log(set.delete(2)) // true
set.clear()
console.log(set.size) // 0

WeakSet

特殊的集合

  • 仅支持对象类型:只能存储对象引用,不支持原始数据类型
  • 不能遍历:WeakSet 不是可迭代对象,不能使用 for...of 循环
  • 缺少项:没有 sizeforEach 方法
  • 弱引用:不会阻止垃圾回收机制回收已存储的对象

API

  • add(value):添加新元素
  • has(value):检测元素是否存在,返回布尔值
  • delete(value):删除指定元素,返回是否删除成功的布尔值

example

const weakSet = new WeakSet()
const obj1 = { name: 'a' }
const obj2 = { name: 'b' }

weakSet.add(obj1)
weakSet.add(obj2)
console.log(weakSet.has(obj1)) // true
weakSet.delete(obj1)
console.log(weakSet.has(obj1)) // false

Map

专用于处理多个键值对的方案,同样不支持通过下标访问

ES6 之前,只能通过普通对象来存储键值对和数据

对比对象的优势

  • key 可以是任意类型,不只是字符串
  • 含有 size 属性,能快速获取元素数量
  • 避免了原型链属性冲突的问题

API

  • set(key, value):设置键值对,返回 Map 实例本身(支持链式调用)
  • get(key):获取指定键的值
  • has(key):检测键是否存在,返回布尔值
  • delete(key):删除指定键,返回是否删除成功的布尔值
  • clear():清空所有元素,无返回值

属性

  • size:属性,获取键值对数量
  • keys():返回所有键的迭代器
  • values():返回所有值的迭代器
  • entries():返回所有键值对的迭代器

其他特性

  • forEach
  • Symbol.iterator
  • Symbol.toStringTag

example

const map = new Map([
  ['name', '张三'],
  ['age', 18]
])

console.log(map.size) // 2
console.log(map.get('name')) // '张三'
console.log(map.has('age')) // true
map.set('gender', 'male')
map.delete('age')
map.clear()

// 遍历
for (const [key, value] of map.entries()) {
  console.log(key, value)
}