【ES6】怎么理解ES6新增Set、Map两种数据结构的?WeakSet和Set,WeakMap和Map的区别

197 阅读3分钟

定义:

Set是一种叫做集合的数据结构, Map是一种叫做字典的数据结构

  • 集合
    是由一堆无序的、相关联的,且不重复的内存结构【数学中称为元素】组成的组合

  • 字典
    是一些元素的集合。每个元素有一个称作key 的域,不同元素的key 各不相同

  • 共同点:集合、字典都可以存储不重复的值

  • 不同点:集合是以[值,值]的形式存储元素,字典是以[键,值]的形式存储

Set

  • 介绍:Setes6新增的数据结构,类似于数组,但是成员的值都是唯一的,没有重复的值, 我们一般称为集合,Set本身是一个构造函数,用来生成 Set 数据结构
  const s = new Set();

增删改查的方法:

  • add()-->添加某个值,返回的Set结构本身,当添加的值Set中已经存在,不会执行操作

  • delete()-->删除某个值,返回布尔值

  • has()-->判断是否为Set成员,返回布尔值

  • clear()-->清除所有成员,没有返回值

遍历方法

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员-->用于对每个成员执行某种操作,没有返回值,键值、键名都相等,同样的forEach方法有第二个参数,用于绑定处理函数的
let set = new Set(['red', 'green', 'blue']);

for (let item of set.keys()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.values()) {
  console.log(item);
}
// red
// green
// blue

for (let item of set.entries()) {
  console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]
let set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 4 : 4
// 9 : 9

Map

定义:

Map类型是键值对的有序列表,而键和值都可以是任意类型,Map本身是一个构造函数,用来生成 Map 数据结构

增删改查:

  • size 属性-->(map1.size)返回Map结构成员总数
  • set()-->设置键名key对应的键值为value,然后返回整个 Map 结构
  • get()-->get方法读取key对应的键值,如果找不到key,返回undefined
  • has()-->判断某个键是否在当前Map对象中
  • delete()-->删除某个键,返回ture或false
  • clear()-->清除所有成员,没有返回值

遍历

  • keys():返回键名的遍历器
  • entries():返回所有成员的遍历器
  • forEach():遍历 Map 的所有成员
const map = new Map([
  ['F', 'no'],
  ['T',  'yes'],
]);

for (let key of map.keys()) {
  console.log(key);
}
// "F"
// "T"

for (let value of map.values()) {
  console.log(value);
}
// "no"
// "yes"

for (let item of map.entries()) {
  console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"

// 或者
for (let [key, value] of map.entries()) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

// 等同于使用map.entries()
for (let [key, value] of map) {
  console.log(key, value);
}
// "F" "no"
// "T" "yes"

map.forEach(function(value, key, map) {
  console.log("Key: %s, Value: %s", key, value);
});

WeakSet 和 WeakMap

WeakSet和Set的区别

  • WeakSet可以接受一个具有 Iterable接口的对象作为参数
  • APIWeakSetSet有两个区别:没有遍历操作的API,没有size属性
  • WeakSet只能成员只能是引用类型,而不能是其他类型的值

WeakMap和Map的区别

  • APIWeakMapMap有两个区别:没有遍历操作的API,没有clear清空方法
  • WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名
  • WeakMap的键名所指向的对象,一旦不再需要,里面的键名对象和所对应的键值对会自动消失,不用手动删除引用