积累
成年人的成长在于一次次的积累
# E02
# Set、Map、WeakSet、WeakMap的区别?
知识点来自ES6
Set、Map、WeakSet、WeakMap这四个都是ES6新增的数据结构。
# Set
Set,类似数组结构,但是其里面元素的值都是唯一的。
Set自身是一个构造函数,用来生成Set结构;
const mySet = new Set();
[1,1,1,2,3,4,5,6,6].forEach(x=>mySet.add(x));
console.log(mySet)//见下图

Set结构有一个size属性,表示数据结构内的元素个数。 而且,Set结构可以接受一个数组(或者具有iterator接口的数据结构)来作为参数进行初始化。
const set1 = new Set([1,2,3,3]);
[...set1] // [1,2,3]
数组去重的方法之一
[...new Set(Array)]
同理,也可以为字符串去重
[...new Set('aaa')].join('') // [...new Set('aaa')] 返回的是['a']
注意:向set结构中添加数据时,不会发生类型转换,Set内部的比较是类似 === 的。但是唯一的区别是,Set内部的NaN===NaN,即一个Set结构内只有一个NaN。
Set结构的方法:add( value )、delete( value )、has( value ) 、clear( )。
Set的遍历方法:返回键名keys( )、返回键值values( )、返回键值对entries( )、forEach( )
其中三个方法返回的都是遍历器对象,但由于Set结构没有键名(键名和键值一样),所有keys和values方法表现是一样的。
# WeakSet
同Set,结构内不能有重复的元素,但是WeakSet只允许添加对象,且不支持遍历。弱引用。
# Map
一般用于数据存储,相比一般的对象结构{key:value} Map结构支持{ value:value },即key值可以是除字符串以为其他的类型。
const map = new Map();
const o = {key:'Map'};
map.set(o,'ssssss');
map.get(o); //'ssssss'
map.has(o); // true
map.delete(o); // true
map.has(o); //false
作为构造函数
const map = new Map([ ['name','ss'],['age',11] ]);
map.size; //2
map.get('name'); // 'ss'
在创建map时,就传入的两个键name和age
事实上,不止数组,任何具有Iterator接口的数据结构都可以当做参数。
Map的方法:sizs、set( key , value )、get( key )、has( key )、delete( key )、clear( )
Map的遍历方法:返回键的遍历器keys( )、返回值values( )、返回键值对entries( ) 、forEach()
# WeakMap
WeakMap与Map类似,但是只接受对象作为键名(null除外),并且WeakMap键名所指向的对象,不计入垃圾回收机制。