Set 与 Map 数据结构

309 阅读3分钟

Set 与 Map 数据结构

Set

类似与数组,但是数值都是唯一的。判断两个值是否相同使用的是( 类精确相等运算符 === ),与其主要的区别是 set 加入时 认为 NAN === NAN

let s = new Set([1, 1, 2, 3, 2]);
console.log(s); // Set(3) { 1, 2, 3 }
console.log([...s]); // [ 1, 2, 3 ]

属性与方法

  • size、成员数量
  • add()、添加某个值,返回本身
  • delete()、删除某个值,返回一个布尔值表示是否删除成功
  • has()、检查是否存在某值,返回一个布尔值
  • clear()、清除所有成员
let s = new Set();

s.add(1)
  .add(2)
  .add(3);

console.log(s); // Set(3) { 1, 2, 3 }

console.log(s.size); // 3

console.log(s.delete(2)); // true

console.log(s); // Set(2) { 1, 3 }

s.clear();

console.log(s); // Set(0) {}

遍历操作

遍历的顺序就是插入的顺序,键名与键值是一样的

  • keys()、键名遍历器
  • values()、键值遍历器
  • entries、键值对遍历器
  • forEach()、回调函数遍历每个元素
let s = new Set(["js", "java", "php"]);

console.log(s.keys()); // [Set Iterator] { 'js', 'java', 'php' }

console.log(s.values()); // [Set Iterator] { 'js', 'java', 'php' }

console.log(s.entries()); // [Set Entries] { [ 'js', 'js' ], [ 'java', 'java' ], [ 'php', 'php' ] }

s.forEach((value, key) => {});

WeakSet

其与 Set 类似,但是存在两个区别

  • WeakSet 的成员只能是对象
  • WeakSet 的对象是弱引用,就是说如果其他对象不再引用该对象,垃圾回收机制会自动回收该对象所占用的内存
    • 因此,WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息,只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。
    • 由于上面这个特点,WeakSet 的成员是不适合引用的,因为它会随时消失。
    • 由于 WeakSet 内部有多少个成员,取决于垃圾回收机制有没有运行,运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此 ES6 规定 WeakSet 不可遍历
  • 不可遍历、没有 size属性 与 clear() 方法。

使用场景

比如我们获取一个 DOM、然后给其绑定一些信息,当页面改变 DOM 消失时,那么当节点从 DOM 树中被删除后,垃圾回收程序就可以立即释放其内存

Map

Map 类似与对象,但是对象只接收字符串作为键名,Map 的键名可以为任何类型的值

let m = new Map([
  ["a", 1],
  ["b", 2],
]);
console.log(m); // Map(2) { 'a' => 1, 'b' => 2 }

属性和操作方法

  • size、成员总数
  • set(key,value)、添加值,如果键名已存在则更新,返回本身
  • get(key)、获取key,如果不存在返回 undefined
  • has(key)、检测是否存在key,返回一个布尔值
  • delete(key)、删除某个key,返回一个布尔值
  • clear()、清空数据,没有返回值
let m = new Map();
m.set("a", 1).set("b", 2);
console.log(m); // Map(2) { 'a' => 1, 'b' => 2 }

console.log(m.size); // 2
console.log(m.get("a")); // 1
console.log(m.has("b")); // true
console.log(m.delete("b")); // true
console.log(m); // Map(1) { 'a' => 1 }

遍历操作

  • keys()、键名遍历器
  • values()、键值遍历器
  • entries、键值对遍历器
  • forEach()、回调函数遍历每个元素
let m = new Map([
  ["a", 1],
  ["b", 2],
  ["c", 3],
]);

console.log(m.keys()); // [Map Iterator] { 'a', 'b', 'c' }

console.log(m.values()); // [Map Iterator] { 1, 2, 3 }

console.log(m.entries()); // [Map Entries] { [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] }

m.forEach((value, key) => {
  console.log(value, key);
});
// 1 a
// 2 b
// 3 c

WeakMap

其与 Map 类似,但是存在两个区别

  • 区别和 WeakSet的一致的