问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

ES6新增Set、Map两种数据结构

创作时间:
作者:
@小白创作中心

ES6新增Set、Map两种数据结构

引用
51CTO
1.
https://blog.51cto.com/u_17151987/12672078

ES6新增了Set和Map两种数据结构,它们分别类似于集合和字典。本文将详细介绍这两种数据结构的使用方法,以及相关的WeakSet和WeakMap。

Set

Set是一种集合数据结构,其成员的值都是唯一的,没有重复的值。Set本身是一个构造函数,用来生成Set数据结构。

增删改查

Set的实例提供了以下方法:

  • add():添加某个值,返回Set结构本身。如果添加实例中已经存在的元素,Set不会进行处理添加。
  • delete():删除某个值,返回一个布尔值,表示删除是否成功。
  • has():返回一个布尔值,判断该值是否为Set的成员。
  • clear():清除所有成员,没有返回值。

遍历

Set实例提供了以下遍历方法:

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach():使用回调函数遍历每个成员

Set的遍历顺序就是插入顺序。keys方法、values方法、entries方法返回的都是遍历器对象。

示例代码

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数据结构。

增删改查

Map结构的实例提供了以下属性和操作方法:

  • size:返回Map结构的成员总数。
  • set():设置键名key对应的键值为value,然后返回整个Map结构。
  • get():读取key对应的键值,如果找不到key,返回undefined。
  • has():返回一个布尔值,表示某个键是否在当前Map对象之中。
  • delete():删除某个键,返回true。如果删除失败,返回false。
  • clear():清除所有成员,没有返回值。

遍历

Map结构原生提供三个遍历器生成函数和一个遍历方法:

  • keys():返回键名的遍历器
  • values():返回键值的遍历器
  • 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

WeakSet可以接受一个具有Iterable接口的对象作为参数。在API中WeakSet与Set有两个区别:

  • 没有遍历操作的API
  • 没有size属性

WeakSet的成员只能是引用类型,而不能是其他类型的值。

WeakMap

WeakMap结构与Map结构类似,也是用于生成键值对的集合。在API中WeakMap与Map有两个区别:

  • 没有遍历操作的API
  • 没有clear清空方法

WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。WeakMap的键名所指向的对象,一旦不再需要,其所对应的WeakMap记录就会自动被移除。

参考文献

  • ES6入门教程
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号