ES6语法——数据结构

本文介绍了ES6中的数据结构,包括Set、WeakSet、Map和WeakMap的用法。Set是不允许重复元素的集合,支持add、delete、clear和has等方法。WeakSet只接受对象作为元素,且不参与垃圾回收,不支持size属性和遍历。Map的key可以是任意类型,而WeakMap的key必须是对象,两者都不支持size属性和clear方法。在数据结构选择上,优先考虑Map,若需唯一性存储则用Set。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构
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)
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值