超级厉害的JavaScript —— ECMAScript 6 标准(5) —— Set 和 Map 数据结构

Set

Set结构类似数组,但是成员的值是唯一的。
Set结构可以接受一个数组作为参数用来初始化:

var set = new Set([1,2,3,4,4]);
console.log([...set] , set.size);//[1,2,3,4] , 4

所以数组去重可以使用这个方法:

array = [...new Set(array)];

Set结构内部判断两个值是否相等,是使用精确相等运算符(===)的,所以1 !== '1'但是NaN会等于NaN。其中两个对象总是不相等的。

let set new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
console.log(set);   //Set [NaN],只有一个NaN元素

set.add(1);
set.add("1");
console.log(set);   //Set [NaN,1,"1"]

set.add({});
set.add({});
console.log(set);   //Set [NaN,1,"1",{},{}];

Set实例的属性和方法

属性

  • constructor:构造方法;
  • size:返回Set实例的成员总数

操作方法

  • add(value):添加value,返回本身;
  • delete(value):删除value,返回布尔值,表示删除是否成功;
  • has(value):返回一个布尔值,判断value是否为Set的成员
  • clear():清楚所有成员

遍历方法

Set结构的遍历顺序是插入顺序

  • keys():返回键名的遍历器;
  • values():返回键值的遍历器;
  • entries():返回键值对的遍历器;
  • forEach():使用回调函数遍历每个成员;

由于Set结构键名和键值是一致的,所有keys()values()的行为是完全一致的;
ertries()同时返回键名和键值,所以每次输出一个数组,它的两个成员完全相同;
Set结构的实例默认遍历器是values(),所以可以直接使用Set进行遍历;

var set = new Set([1,2,3,3]);

for(let item of set.keys()){
    console.log(item);
}
/*
1
2
3
*/

for(let item of set.values()){
    console.log(item);
}
/*
1
2
3
*/

for(let item of set.entries()){
    console.log(item);
}
/*
[1,1]
[2,2]
[3,3]
*/

for(let item of set){
    console.log(item);
}
/*
1
2
3
*/

set.forEach((value,key,condition)=>console.log(value * 2));
/*
2
4
5
*/

Set结构本身是不支持数组的everysomemapfilter的。

Array.from方法可以将Set结构转为数组

var set = new Set([1,2,3,4,4,5]);
var array = Array.from(set);
console.log(array);     //[1,2,3,4,5]

WeakSet

WeakSet结构与Set结构类似,都是不重复的值的集合,但是:
- WeakSet 结构的成员只能是对象,而不能是其他类型的值;
- WeakSet中的对象都是弱引用,如果其他对象的值不再引用该对象,那么该对象就会被回收,不会考虑还存在于WeakSet中
- WeakSet没有size属性,并且是不可以遍历的

WeakSet 的用处

WeakSet结构有三个方法:add(value)delete(value)has(value)
主要用处是储存DOM节点,而不用担心这些节点从文档移除时,会引发内存泄漏。


Map

Map结构类似于对象,但是Map允许使用各种类型的值作为;
Map结构可以接受一个数组作为参数,该数组的成员是一个个表示键值对的数组:

var map = new Map([
    ['key','value'],
    ['name','张三'],
    ['title','Author']
]);
map.size        // 2
map.has('name') //true

Map结构内部判断两个键是否相等,是使用精确相等运算符(===)的,所以1 !== "1",true !==”true”但是NaN会等于NaN。其中,键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。

var map = new Map();
map.set(['a'],555);
console.log(map.get(['a']));//undefined,数组也是一个对象

Map实例的属性和方法

属性

  • size:返回Map结构的成员总数;

操作方法

  • set(key,value):设置key所对应的键值,然后返回整个Map结构,如果key已经有值,则键值会被更新,否则生成该键;
  • get(key):获取key所对应的键值,如果找不到key,返回undefined;
  • has(key):返回一个布尔值,表示该键是否在Map数据结构中;
  • delete(key):删除某个键,返回布尔值,表示是否成功;
  • clear():清空所有成员;

遍历方法

Map结构的遍历顺序是插入顺序

  • keys():返回键名的遍历器;
  • values():返回键值的遍历器;
  • entries():返回键值对的遍历器;
  • forEach():使用回调函数遍历每个成员;
    基本同Set结构一致;

WeakMap

基本同WeakSet


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值