JavaScript基础知识介绍——maps和sets

ES6引入了两个数据结构:maps和sets。maps跟对象类似,可用键(key)来map值(value)、sets则类似于数组,只不过不允许出现重复值

一、maps:

map对象将键和值映射起来的

example:

想把user对象映射到role的时候:

const u1 = { name:"Cynthia"};
const u2 = { name:"Jackson"};
const u3 = { name:"James"};

从创建一个map对象开始:

const userRole = new Map();

可以使用map中的set()方法把user赋给role:

userRole          //链式调用set()方法,节省打字时间
     .set(u1,"User");
     .set(u2,"User");
     .set(u3,"Admin");

还可以给map的构造函数穿一个包含了数组的数组:

const userRole = new Map([
  [u1,"User"],
  [u2,"User"],
  [u3,"Admin"],
]);

如果想知道u2有什么role,可使用get()方法就行:

userRole.get(u2);   //"User"

如果调用的key在map中不存在,就会返回一个undefined。当然也可使用has()方法来查看map中是否包含给定的key:

userRole.has(u1);   //true
userRole.get(u1);   //"User"
userRole.has(u3);   //false
userRole.get(u3);   //undefined

如果key已经在map中了,那么调用set()后key对应的value就会被替换

userRole.get(u1);   //"User"
userRole.set(u1,"Admin");   
userRole.get(u1);   //"Admin"

size属性返回map中的元素个数:

userRole.size;   //3

使用keys()方法可以拿到map中所有的键,values()可以拿到所有的值,entries()则可以以数组的方式获取键值对,数组中的第一个元素为键,第二个元素为值。所有这些方法都返回一个迭代的对象,从而用for...of循环来迭代

for(let u of userRole.keys())
    console.log(u.name);
for(let u of userRole.values())
    console.log(r);
for(let u of userRole.entries())     //简写为:for(let [u,r] of userRoles)
    console.log('${u.name}:${r}');

如果需要一个数组(而不是一个可迭代的对象),可使用展开运算符:

[...userRole.values()];   //["User","User","Admin"]

使用delete()方法可以删除map中的一个条目:

userRole.delete(u2);
userRole.size;   //2

最后如果想删除map中的所有条目,可调用clear()方法:

userRole.clear();  
userRole.size;     //0

二、Wake maps:

weak map跟Map在本质上是相同的,除了以下几点:

  • key必须是对象
  • WeakMap中的key可以被垃圾回收
  • WeakMap不能迭代或清空

WeakMap不能被迭代(因为在迭代中,暴露处于垃圾回收过程中的对象,是非常危险的,不会保留在内存)

正是因为WeakMap具备这些特性,才可以用它存储对象实例中的私有key

三、sets:

sets是一个不允许重复数据的集合

创建一个Set实例:

const roles = new Set();

如果想添加一个user role,可用add()方法:

roles.add("User");    //Set ["User"]

如果想把这个user编程管理员,急需调用add()方法:

roles.add("Admin");     //Set ["User","Admin"]

跟Map一样,Set也有size属性:

roles.size;    //2

Set神奇之处:不需要再添加元素的时候中是否已有这个元素 ,如果添加早已存在于set中的值,什么都不会发生:

roles.add("User");    //Set ["User","Admin"]
roles.size;           //2

删除roles,调用delete()方法即可,当它返回true的时候表示这个roles在set,否则返回false:

roles.delete("Admin");   //true
roles;                   //Set ["User"]
roles.delete("Admin");   //false

四、Weak sets:

Weak Sets只能包含对象,这些对象可能会被垃圾回收。跟WeakMap类似,WeakSets中的值不能被迭代

Weak Sets的唯一用处就是判断给定对象是不是一个set

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值