数据结构
Set的用法
- 是一种集合,(可以当作数组来使用)
- Set集合中的元素是不能重复的
- Set定义 第一种不加参数,第二种加参数
- Set集合中的元素不能重复,这个特性可以用于去重
- Set实例方法 add delete clear has 还有遍历的方法
WeakSet的用法
Map的用法
- Map可以和Object做对比
- Object中的key必须是字符串,但是也允许Symbol数据类型作用key值
- Map中的key可以是任何数据类型(这是Map对Object做的补充)
WeakMap的用法
WeakSet和WeakMap分别是Set和Map的弱用法
Set
{
//Set数据类型
let list = new Set();// new的方式得到一个list,list是Set数据类型
list.add(5);//Set的add方法添加集合的元素
list.add(7);
//Set的size方法获取Set集合的长度(类似于Array的length)
console.log('size',list.size);//2
}
{
let arr = [1,2,3,4,5];
let list = new Set(arr);//传入数组,Set转化为Set集合
console.log('size',list.size);//5
}
{
//Set 集合中的元素不能重复
let list = new Set();
list.add(1);
list.add(5);
list.add(1);//重复添加不生效,同时也不报错
console.log(list);//{1,5}
//这个特性可以用来去重
let arr = [1,2,3,3,4,4,5,5,'5'];
let list0 = new Set(arr);
console.log(list0);//{1,2,3,4,5,'5'}
//不做数据类型的转换,参照'5'
}
{
//Set 实例的几个方法 add delete clear has
//添加 删除 清空 有没有
let arr = ['add', 'delete', 'clear', 'has']
let list = new Set(arr);
console.log('has',list.has('add'));//true
console.log('delete',list.delete('add'));//{'delete','clear','has'}
list.clear();
console.log('list',list);//{}
}
{
//Set数据的遍历(Set数据的读取)
//Set数据类型的 key 和 value 是相同的
//let of 不注明value ,默认就是value
let arr = ['add', 'delete', 'clear', 'has']
let list = new Set(arr);
for(let key of list.keys()){
console.log('keys',key)//add delete clear has
}
for(let value of list.values()){
console.log('value',value)// add delete clear has
}
for(let value of list){
console.log('value',value)//add delete clear has
}
for(let [key,value] of list.entries()){
console.log('entries',key,value)
}//add add delete delete clear clear has has
list.forEach(function(item){
console.log(item)//add delete clear has
})
}
WeakSet
- WeakSet 和 Set 支持的数据类型不一样
- WeakSet 的元素只能是对象,不能是数值、boolean、字符串之类,必须是对象
- WeakSet 对象这块是个弱引用,它不会检测这个对象在哪里用过,这也就意味着它不会跟垃圾回收机制挂钩上(通俗讲,在WeakSet中添加了对象,这个对象不是整个值拷过来,它是地址的引用,而且它也不会检测这个地址是不是已经被垃圾回收掉了,它不去检测)
- WeakSet没有size属性,没有clear方法,不能遍历
- WeakSet有has、delete、add方法和Set使用一样
{
//WeakSet定义
let weakList = new WeakSet();
let arg = {};
weakList.add(arg);
console.log(weakList)//
//weakList.add(10)//报错
}
Map
- Map可以和Object做对比
- Object中的key必须是字符串,但是也允许Symbol数据类型作用key值
- Map中的key可以是任何数据类型(这是Map对Object做的补充)
- Map 添加元素是 set 方法 ,获取元素是get方法
- Map 的遍历方法 比如 keys values entries forEach 和Set一摸一样
{
//
let map = new Map();
let arr = ['123'];
map.set(arr,456);
console.log('map',map,map.get(arr));//456
}
{
//
let map = new Map([['a',123],['b',456]])
console.log(map,map.get('a'),map.get('b'));
console.log('size',map.size)//2
console.log('delete', map.delete('a'),map)
console.log('clear',map.clear(),map)//{}
}
WeakMap
- WeakMap 与Map的区别 和 WeakSet与Set的区别一样
- WeakMap 接收的key值必须是对象,没有size属性,不能使用clear方法,不能遍历
{
//
let weakmap = new WeakMap();
let o = {};
weakmap.set(o,123);
console.log(weakmap,get(o))//123
}
ES5、ES6数据结构对比
- Map与Array的对比
- Set与Array的对比
- Map与Object的对比
- Set与Object的对比
- 数据结构主要使用数组和对象
- 数据结构特点:增、查、改、删
{
//数据结构横向对比,增、查、改、删
let map = new Map();
let array = []
//增 //map set // array push unshift
map.set('t',1);
array.push({t:1});
console.info('map-array-add',map,array);
//查 //map has // array find
let map_exist = map.has('t');
let array_exist = array.find(item=>item.t);
console.info('map-array-find',map_exist,array_exist)
//改 //map set // array forEach 循环遍历然后改
map.set('t',2);
array.forEach(item=>item.t?item.t=2:'');
console.info('map-array-modify',map,array);
//删 //map delete // array findIndex 先找到这个值的索引,然后splice去删
map.delete('t');
let index=array.findIndex(item=>item.t);
array.splice(index,1);
console.info('map-array-delete',map,array)
}
Set、Array对比
{
let set = new Set();
let array = []
//增
set.add({t:1});
array.push({t:1})
console.info('set-array',set,array);
//查
let set_exist = set.has({t:1})//false
let array_exit = array.find(item=>item.t)
console.info('set-array',set_exist,array_exit)
//改
set.forEach(item=>item.t?item.t=2:'');
array.forEach(item=>item.t?item.t=2:'');
console.info('set-array',set,array)
//删
set.forEach(item=>item.t?set.delete(item):'');
let index = array.findIndex(item=>item.t);
array.splice(index,1);
console.info('set-array',set,array)
}
Map、Object、Set的对比
- 数据结构中,能使用Map不使用Array
- 对数组存储要求唯一性,那就使用Set
- 优先使用Map,数组唯一性要求,那就使用Set
- 放弃使用Object,然后是Array
{
let item = {t:1};
let map = new Map();
let set = new Set();
let obj = {}
//增
map.set('t',1);
set.add(item);
obj['t']=1
console.info(map,set,obj)
//查
console.info({
map_exist: map.has('t'),
set_exist: set.has(item),
obj_exist: 't' in obj
})
//改
map.set('t',2);
item.t = 2;//set存储数据元素的话,直接修改数据本身,如果没有的话,使用forEach去遍历
obj['t'] = 2;
console.log(map,set,obj)
//删
//map set 语义上都是delete,但set没有引用的话,需要forEach去遍历然后删除
map.delete('t');
set.delete(item);
delete obj['t'];
console.log(map,set,obj)
}