ECMAScript6--11.Set-Map数据结构
2017-10-21 本文已影响21人
飞菲fly
1.数据结构
-
Set的用法
- 可以当成数组来理解,一种集合;
- set集合中的元素是不能重复的;(Set这个特性可以做去重;)
-
WeakSet的用法
-
Map的用法
- 和Object做对比;一个key、一个value值;object的key一定是字符串;
- Map中的key可以是任意的数据类型;比如数组、一个对象作为它的key都可以;
-
WeakMap的用法
2.怎么用?什么场景用?
-
Set增加元素用add方法;
-
获取当前Set变量有几个元素用size属性;
{ //向Set里面增加元素的时候要用add这个方法; let list = new Set(); list.add(5); list.add(7); //获取当前Set变量有几个元素(可以理解原来数组的长度length); console.log('size',list.size); //size 2 } { //Set初始化的时候就把元素初始化进去(默认值的意思); let arr = [1,2,3,4,5]; let list = new Set(arr); cosole.log('size',list.size); //5 }
-
添加重复会报错;
- Set使用很重要的一个场景就是去重;
{
let list = new Set();
list.add(1);
list.add(2);
//这个是没有成功添加进去的;添加重复的是不会报错的,只是不会生效而已;
list.add(1);
console.log('list',list); //list Set{1,2}
//Set使用很重要的一个场景就是去重;
//*它在转换元素的时候,不会做数据类型一个转换;
let arr =[1,2,3,1,2];
//let arr =[1,2,3,1,'2'];
let list2 = new Set(arr);
console.log('unique',list2); //unique Set{1,2,3}
//console.log('unique',list2); //unique Set{1,2,3,'2'}
}
-
Set方法:add、delete、clear、has
{ let arr =['add','delete','clear','has']; let list = new Set(arr); console.log('has',list.has('add')); //has true console.log('delete',list.delete('add'),list); //输出:delete true Set{"delete","clear","has"} list.clear(); console.log('list',list);//list Set{} }
-
Set遍历(读取)
{
let arr =['add','delete','clear','has'];
let list = new Set(arr);
for(let key of list.keys()){
console.log('keys',key);
//keys add
//keys delete
//keys clear
//keys has
}
for(let value of list.values()){
console.log('value',value);
//value add
//value delete
//value clear
//value has
}
for(let value of list){
console.log('value',value);
//value add
//value delete
//value clear
//value has
}
for(let [key,value] of list.entries()){
console.log('entries',key,value);
//entries add add
//entries delete delete
//entries clear clear
//entries has has
}
list.forEach(function(item){
console.log(item);
});
//add
//delete
//clear
//has
}
-
Set和weakSet的区别:
-
WeakSet和Set支持的数据类型不一样;
WeakSet的元素只能是对象,不能是数值、布尔值、字符串; -
WeakSet中的对象都是弱引用,不会检测这个对象有没有在其他地方用过;不会跟垃圾回收机制挂钩上。
(在WeakSet中添加了一个对象,这个对象不是整个值拷过来,它是一个地址的引用,不会检测这个地址是不是已经被垃圾回收掉了) - weakSet没有size属性 ,没有clear方法,不能遍历;
-
WeakSet和Set支持的数据类型不一样;
{
let weakList = new WeakSet();
let arg = {};
weakList.add(arg);
//weakList.add(2); //会报错,无效的值used in weak set;
console.log('weakList',weakList); //weakList weakSet{Object{}}
}
-
Map添加元素用set方法;set(key,value)
- Map中的key可以是任意的数据类型;
{
let map = new Map();
let arr = ['123'];
map.set(arr,456);
console.log('map',map,map.get(arr));
//map Map{["123"] =>456} 456
}
-
常用的属性值和方法:
- Map的遍历和Set用法是一样的,keys、values、entries、forEach
{
let map = new Map([['a',123],['b',456]]);
console.log('map args',map);
//map args Map{"a" =>123,"b" =>456}
//获取map对象有多少个元素;
console.log('size',map.size); //size 2
//获取某一个用get;
//删除:delete
console.log('delete',map.delete('a'),map);
//delete true Map{"b" =>456}
//清空clear
console.log('clear',map.clear(),map);
//clear undefined Map{}
//Map的遍历和Set用法是一样的,keys、values、entries、forEach
}
-
WeakMap和Map的区别:
- WeakMap接收的key值必须是对象,不能是其他的;
- WeakMap没有size属性,不能使用clear;
- WeakMap不能遍历;
{ let weakmap = new WeakMap(); let o ={}; weakmap.set(o,123); console.log(weakmap.get(o)); //123 }