Map和Set

1、Set

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

Set本身是一个构造函数。可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用于初始化

Set类型的对象,可以通过add方法添加一个成员元素。

Set是一种好的数组去重的方法。

var arr = [1,2,3,2,2,5];
var arr = [...new Set(arr)];

在JavaScript中,NaN和NaN是不相等的。而且 [] 和 [] 也是不相等的。并且 {} 和 {} 还是不相等的。

但是在Set数据结构中,NaN和NaN是相等的。[] 和 [] 是不相等的。{} 和 {} 是不相等的。

var set = new Set();
set.add(NaN);
set.add(NaN);
set.size;// 1

Set的原型上有这么几个东西:

  1. Set.prototype.size:number——代表Set类型的实例的成员数量。
  2. Set.prototype.add:function——代表新增一个元素。
  3. Set.prototype.delete:function——代表删除一个元素。
  4. Set.prototype.has:function——代表是否拥有某一个元素。
  5. Set.prototype.clear:function——代表清除所有的set类型的元素。

Set类型数据的遍历:
<1>、第一类

  • set.keys()
  • set.values()
  • set.entris()
  • 使用for of遍历
  • forEach遍历

切记,Set数据类型不是数组,它不支持map、filter等数组方法,但是可以间接的使用:

var set = new Set([1,2,3,4].filter(item => item%2==0))

可以使用Set数据类型轻松的实现并集、交集、差集。

let a = new Set([1,2,3]);
let b = new Set([4,3,2]);

//并集
let union = new Set([...a, ...b]);

//交集
let intersect = new Set([...a].filter((item, index) => {
    return b.has(item);
}));

//差集
let intersect = new Set([...a].filter((item, index) => {
    return !b.has(item);
}));

2、WeakSet

  • WeakSet也是一种不可重复的数据类型。和Set数据类型的区别就是,WeakSet的成员只能是对象,不能是其他类型的值。
  • WeakSet中的对象是弱引用,也就是垃圾回收机制不会考虑WeakSet 中的对象引用,所以WeakSet中的对象会在不可控的时间内会被垃圾回收机制回收,所以对于WeakSet 中的对象是不可遍历的。
  • WeakSet没有size属性、也没有forEach方法。
  • WeakSet拥有的方法有:add、delete、has。

Map

  • Js的对象,提供了一种 key,value 的数据组合方式,但是这个key,只能是字符串类型。
  • 有时候,我们可能需要另外的一种数据结构,就是key不仅仅局限于string类型,也可是任何数据类型。最终成就一种 value—value 的对应关系。
  • Map类型的实例对象,拥有size属性,代表实例的个数。拥有set方法,用于添加一个元素。拥有get方法,用于获取元素。

基本使用:

扫描二维码关注公众号,回复: 2643724 查看本文章
var map = new Map();
var obj = { name: 'mapbar' };

map.set(obj, 'front');
map.has(obj);//true
map.get(obj);//front;

Set数据类型、Map数据类型,都可以生成新的Map数据类型。但是必须是特殊的Set数据结构。

const set = new Set([
    ['foo', 1],
    ['bar', 2]
]);
const m1 = new Map(set);
m1.get('foo');// 1

const m2 = new Map([['baz', 3]]);
const m3 = new Map(m2);
m3.get('baz');// 3
  • Map数据类型读取一个未知的键,返回 undefined。
  • 只有对同一个对象的引用,Map结构才将其视为同一个键。
const map = new Map();
map.set(['a'], 555);
map.get(['a']);// undefined

Map构造函数的实例,拥有的属性和方法有:size属性、set、get、has、clear、delete等方法。

Map的遍历,也是通过keys()、values()、entries()、forEach()等方法。

Map的实例对象,不能直接使用filter、map等数组方法。但是可以间接的使用。

4、WeakMap

Map数据类型,对应的WeakMap的一个数据类型,和Map不同的是,WeakMap只接受一个对象作为键名。而这个对象被释放的时候,WeakMap的这个key也会被释放。

基于这样的特性,WeakMap构造的实例是不能被遍历的。WeakMap构造的实例的键名所指的对象,不计入垃圾回收机制。

WeakMap 应用的典型场合就是 DOM 节点作为键名

let myElement = document.getElementById('logo');
let myWeakmap = new WeakMap();

myWeakmap.set(myElement, {timesClicked: 0});

myElement.addEventListener('click', function() {
  let logoData = myWeakmap.get(myElement);
  logoData.timesClicked++;
}, false);

猜你喜欢

转载自blog.csdn.net/mapbar_front/article/details/80820157