es6中的Set和Map内容整理

Set:是一种新的数据结构,类似于数组,但是里面的值都是唯一的

set本身是一个构造函数,可以通过const set = new Set()来创建一个set类型的值,通过构造函数创建后,会得到set原型上的一些方法

 

ps:通过构造函数创建新对象的过程,开辟一块新内存,创建一个空对象,设置原型继承原型上的方法,绑定this,执行构造函数中的方法,返回这个新对象

一般可以用set去除数组中的重复元素:[...new Set(array)],    Array.from(new Set(array))]

 

Set上的一些方法:

add(): 添加元素

delete():删除某个值

has(): 判断set中是否有这个值

clear():清空所有值

 

遍历操作:

keys():返回键名

values(): 返回键值

entries():返回键值对

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
let set = new Set(['red', 'green', 'blue']);
// for...of 循环(set数据结构默认可遍历,可以直接用for of 循环替换values()) for (let x of set) { console.log(x); } // red // green // blue

for (let item of set.entries()) { console.log(item); } // ["red", "red"] // ["green", "green"] // ["blue", "blue"]

使用forEach循环

let set = new Set([1, 4, 9]);
set.forEach((value, key) => console.log(key + ' : ' + value))
// 1 : 1
// 4 : 4
// 9 : 9

可以间接使用数组中的方法

let set = new Set([1, 2, 3]);
set = new Set([...set].map(x => x * 2));
// 返回Set结构:{2, 4, 6}

let set = new Set([1, 2, 3, 4, 5]);
set = new Set([...set].filter(x => (x % 2) == 0));
// 返回Set结构:{2, 4}

WeakSet:

与Set的区别:

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

WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用

 

weakSet中的一些方法:

add(), delete(), has()

 

Map:一种数据结构,也是键值对的集合,但是各种类型的值都可以用作键

 传统的对象Object,本质上是键值对集合,但是传统上只能用字符串当作键,Map解决了这种问题

1.可以通过Map上的set方法,添加属性

const m = new Map();
const o = {p: 'Hello World'};

m.set(o, 'content')
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

2.通过数组创建

const map = new Map([
  ['name', '张三'],
  ['title', 'Author']
]);

Map(2) {'name' => '张三', 'title' => 'Author'}
[[Entries]]
0: {"name" => "张三"}
1: {"title" => "Author"}
size: 2
[[Prototype]]: Map

注意:只有对同一个对象的引用,才算是同一个键

const map = new Map();

map.set(['a'], 555);
map.get(['a']) // undefined

此时set和get对应的是两个不同的内存地址,所以get方法读取不到该值

 

Map()上的一些方法:

set():设置属性

get():读取属性

has():判断是否含有该属性

delete():删除属性

clear():清除所有属性

 

一些遍历方法:

keys(): 返回键名的遍历器

values(): 返回键值的遍历器

entries():返回所有成员的遍历器

forEach():遍历

 

可以通过[...map]来将Map数据结构转成数组结构,从而来实现一些数组上的方法

 

Map和对象互转:

Map转为对象:

function strMapToObj(strMap) {
  let obj = Object.create(null);
  for (let [k,v] of strMap) {
    obj[k] = v;
  }
  return obj;
}

const myMap = new Map()
  .set('yes', true)
  .set('no', false);
strMapToObj(myMap)
// { yes: true, no: false }

对象转为Map:

let obj = {"a":1, "b":2};
let map = new Map(Object.entries(obj));

 

WeakMap:只接受对象作为键名,键名所指向的对象不计入垃圾回收机制

posted @ 2022-05-19 10:15  千亿昔  阅读(45)  评论(0编辑  收藏  举报