ES6:数据结构Set和Map&WeakSet和WeakMap
在ES6以前存储数据的结构有两种:
数组 和
对象 。
在ES6中新增两种数据结构:Set 和Map 。
Set
Set里边的数据是不会重复的
基本使用
add方法添加
const set = new Set();
set.add(1);
set.add(2);
set.add(3);
set.add(2);
set.add(1);
console.log(set);
传入数组
const nums = [1, 2, 3, 2, 1];
const set1 = new Set(nums);
console.log(set1);
Set结构传化为数组
const nums = [1, 2, 3, 2, 1];
const set = new Set(nums);
console.log(set);
const arr1 = [...set];
const arr2 = Array.from(set);
console.log(arr1);
console.log(arr2);
常见方法
const set = new Set();
set.add(1);
set.add(2);
set.add(1);
console.log(set);
set.delete(1);
console.log(set);
console.log(set.has(2));
set.add(3);
set.forEach((item) => console.log(item));
for (const item of set) {
console.log(item);
}
set.clear();
console.log(set);
WeakSet
WeakSet的特点
存在一个与Set 相似的数据结构WeakSet 。
区别: 1、WeakSet 只能添加对象类型,而Set 可以添加其他基本数据类型。
? 2、WeakSet 对数据的引用是弱引用,而Set 对数据的引用是强引用,GC算法会对弱引用对象进行回收。
基本使用
const info = { name: "fzb" };
const weakSet = new WeakSet();
weakSet.add({});
weakSet.add(info);
console.log(weakSet.has(info));
weakSet.delete(info);
console.log(weakSet);
WeakMap的应用
const weakSet = new WeakSet();
class Person {
constructor() {
weakSet.add(this);
}
running() {
if (!weakSet.has(this)) {
console.log("只能通过创造出来的实例对象调用该方法");
return;
}
console.log("running~");
}
}
const person = new Person();
person.running();
person.running.call({ name: "fzb" });
console.log(person);
Map
ES6新增Map 用来处理映射关系,普通的对象也可以处理映射关系,但是这是一种简单的处理,普通的对象的key值,最终是转化为 字符串,而Map 的key是不会转化为字符串的。
基本使用
创建方法一
const map = new Map();
map.set(1, "fzb");
map.set("2", 21);
map.set({}, "changsha");
console.log(map);
创建方法二
const map = new Map([
[1, "fzb"],
["2", 21],
[{}, "changsha"],
]);
console.log(map);
常见方法
const map = new Map();
map.set(1, "fzb");
map.set({}, 21);
console.log(map.get(1));
console.log(map.has(1));
console.log(map.delete(1));
map.forEach((item, key) => {
console.log(item, key);
});
for (const [key, item] of map) {
console.log(key, item);
}
map.clear();
console.log(map);
WeakMap
WeakMap的特点
存在一个与Map 相似的数据结构WeakMap 。
区别:1、WeakMap 的key值只能是对象类型的,而Map 的key值可以是其他的数据类型
? 2、WeakMap 的key值的引用是弱引用,而Map 的key值得引用是强引用,GC算法会对弱引用对象进行回收。
基本使用
const info = {};
const weakMap = new WeakMap();
weakMap.set({}, "fzb");
weakMap.set(info, 21);
console.log(weakMap.has(info));
console.log(weakMap.get(info));
console.log(weakMap.delete(info));
console.log(weakMap);
强引用和弱引用
强引用是不会被GC算法回收的,但弱引用会被GC算法回收
const set = new Set();
const obj1 = { name: "obj1" };
set.add(obj1);
obj1 = null;
const weakSet = new WeakSet();
const obj2 = { name: "obj2" };
weakSet.add(obj2);
obj2 = null;
|