ES6引入了两个数据结构:maps和sets。maps跟对象类似,可用键(key)来map值(value)、sets则类似于数组,只不过不允许出现重复值
一、maps:
map对象将键和值映射起来的
example:
想把user对象映射到role的时候:
1
2
3
4const u1 = { name:"Cynthia"}; const u2 = { name:"Jackson"}; const u3 = { name:"James"};
从创建一个map对象开始:
1const userRole = new Map();
可以使用map中的set()方法把user赋给role:
1
2
3
4
5userRole //链式调用set()方法,节省打字时间 .set(u1,"User"); .set(u2,"User"); .set(u3,"Admin");
还可以给map的构造函数穿一个包含了数组的数组:
1
2
3
4
5
6const userRole = new Map([ [u1,"User"], [u2,"User"], [u3,"Admin"], ]);
如果想知道u2有什么role,可使用get()方法就行:
1
2userRole.get(u2); //"User"
如果调用的key在map中不存在,就会返回一个undefined。当然也可使用has()方法来查看map中是否包含给定的key:
1
2
3
4
5
6
7
8userRole.has(u1); //true userRole.get(u1); //"User" userRole.has(u3); //false userRole.get(u3); //undefined
如果key已经在map中了,那么调用set()后key对应的value就会被替换
1
2
3
4
5
6userRole.get(u1); //"User" userRole.set(u1,"Admin"); userRole.get(u1); //"Admin"
size属性返回map中的元素个数:
1
2userRole.size; //3
使用keys()方法可以拿到map中所有的键,values()可以拿到所有的值,entries()则可以以数组的方式获取键值对,数组中的第一个元素为键,第二个元素为值。所有这些方法都返回一个迭代的对象,从而用for...of循环来迭代
1
2
3
4
5
6
7for(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}');
如果需要一个数组(而不是一个可迭代的对象),可使用展开运算符:
1
2
3[...userRole.values()]; //["User","User","Admin"]
使用delete()方法可以删除map中的一个条目:
1
2
3userRole.delete(u2); userRole.size; //2
最后如果想删除map中的所有条目,可调用clear()方法:
1
2
3userRole.clear(); userRole.size; //0
二、Wake maps:
weak map跟Map在本质上是相同的,除了以下几点:
- key必须是对象
- WeakMap中的key可以被垃圾回收
- WeakMap不能迭代或清空
WeakMap不能被迭代(因为在迭代中,暴露处于垃圾回收过程中的对象,是非常危险的,不会保留在内存)
正是因为WeakMap具备这些特性,才可以用它存储对象实例中的私有key
三、sets:
sets是一个不允许重复数据的集合
创建一个Set实例:
1const roles = new Set();
如果想添加一个user role,可用add()方法:
1
2roles.add("User"); //Set ["User"]
如果想把这个user编程管理员,急需调用add()方法:
1
2roles.add("Admin"); //Set ["User","Admin"]
跟Map一样,Set也有size属性:
1
2roles.size; //2
Set神奇之处:不需要再添加元素的时候中是否已有这个元素 ,如果添加早已存在于set中的值,什么都不会发生:
1
2
3
4roles.add("User"); //Set ["User","Admin"] roles.size; //2
删除roles,调用delete()方法即可,当它返回true的时候表示这个roles在set,否则返回false:
1
2
3
4
5
6roles.delete("Admin"); //true roles; //Set ["User"] roles.delete("Admin"); //false
四、Weak sets:
Weak Sets只能包含对象,这些对象可能会被垃圾回收。跟WeakMap类似,WeakSets中的值不能被迭代
Weak Sets的唯一用处就是判断给定对象是不是一个set
最后
以上就是高大往事最近收集整理的关于JavaScript基础知识介绍——maps和sets的全部内容,更多相关JavaScript基础知识介绍——maps和sets内容请搜索靠谱客的其他文章。
发表评论 取消回复