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循环 - 缺少项:没有
size和forEach方法 - 弱引用:不会阻止垃圾回收机制回收已存储的对象
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():返回所有键值对的迭代器
其他特性
forEachSymbol.iteratorSymbol.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)
}