当前位置: 首页 > Web前端 > vue.js

ES6中Map和Set这两个数据结构的作用

时间:2023-03-31 15:46:09 vue.js

Set,Map,WeakSet,WeakMap如果要用一句话来形容的话,我们可以说Set是一种数据结构,叫做集合,Map是一种数据称为字典的结构那么什么是集合?什么是字典?集合是由一堆无序的、关联的、不重复的记忆结构[数学上称为元素]组成的组合字典。字典是一些元素的集合。每个元素都有一个叫做key的字段,不同的元素是不同的。那么集合和字典有什么区别呢?共同点:集合和字典都可以存储唯一值不同点:集合以[value,value]的形式存储元素,字典以[key,value]的形式存储元素背景大多数主流编程语言都有多个内置-数据收集。比如Python有列表(lists)、元组(tuples)和字典(dictionary),Java有列表(lists)、集合(sets)、队列(queues)。但是JavaScript只有数组(arrays)和ES6之前内置的对象(object)这两种数据集合,我们通常使用内置的Object来模拟Map,但是这样模拟出来的map会有一些缺陷,如下:Object的属性key是String或者Symbol,这限制了他们只能是不同数据类型的key/value对的集合Object本来就不是数据的集合,所以没有直接高效的方式判断一个对象有多少个属性Set定义:Set对象允许您存储任何类型的唯一值,无论是原始值还是对象引用,Set对象是值的集合,您可以按照它们的顺序迭代其元素被插入。Set中的元素只会出现一次,即Set中的元素是唯一的。Set本身是一个用于生成Set数据结构的构造函数。基本上使用语法newSet([iterable])接收数组(或其他具有可迭代接口的数据结构),返回一个新的Set对象constset=newSet([1,2,1,2])console.log(set)//{1,2}上面的代码表明,Set可以从数组中移除重复的元素属性和方法属性size:返回集合包含的元素个数console.log(newSet([1,2,1,2]).size)//2操作方法add(value):添加到set中添加一个新项delete(value):从set中删除一个值has(value):如果该值存在则返回true在集合中,否则返回falseclear():移除集合中的所有项letset=newSet()set.add(1)set.add(2)set.add(2)set.add(3)console.log(set)//{1,2,3}set.has(2)//trueset.delete(2)set.has(2)//falseset.clear()遍历方法keys():返回keynamevalues():返回keyvalue的遍历器entries():返回key-valuepair的遍历器implementerforEach():使用回调函数来traverseeachmemberletset=newSet([1,2,3,4])//由于set只有键值,没有键名,所以keys()和values()的行为是完全一样的console.log(Array.from(set.keys()))//[1,2,3,4]console.log(Array.from(set.values()))//[1,2,3,4]console.log(Array.from(set.entries()))//[[1,1],[2,2],[3,3],[4,4]]set.forEach((item)=>{console.log(item)})//1,2,3,4应用场景因为Set结构的值是唯一的,所以我们可以轻松实现如下//数组去重letarr=[1,1,2,3];letunique=[...newSet(arr)];让a=newSet([1,2,3]);让b=新集([4,3,2]);//unionletunion=[...newSet([...a,...b])];//[1,2,3,4]//交集letintersect=[...newSet([...a].filter(x=>b.has(x)))];[2,3]//差异letdifference=Array.from(newSet([...a].filter(x=>!b.has(x))));[1]WeakSetWeakSet对象是一个对象值的集合,每个对象值在WeakSet的集合中只能出现一次,这是WeakSet唯一解决弱引用对象存储场景的主要方法,其结构类似于集。与Set相比,WeakSet只能是对象的集合,不能是任何类型的任意值。对WeakSet集合中对象的引用是弱引用。如果WeakSet中的对象没有其他引用,那么这些对象将被垃圾回收。这也意味着WeakSet中没有存储当前对象的列表。因此,WeakSet是不可枚举的。WeakSet的性质和操作方法与Set一致。不同的是WeakSet没有遍历方法,因为它的成员都是弱引用,随时会消失,遍历机制不能保证成员的存在。我们一直在说弱引用,那么弱引用到底是什么意思呢?弱引用是指不能确保其引用的对象不会被垃圾收集器回收的引用。换句话说,它可以随时回收。MapMap对象保存键值对,可以记住键的原始插入顺序。任何值(对象或基元)都可以用作键或值。Map对象将根据对象中元素的插入顺序进行迭代—for...of循环将在每次迭代后返回[key,value]形式的数组。基本上,语法newMap([iterable])Iterable可以是数组或其他可迭代对象,其元素是键值对(两个元素的数组,例如:[[1,'one'],[2,'two']]).每个键值对将被添加到一个新的Mapletmap=newMap()map.set('name','vuejs.cn');console.log(map.get('name'))的属性和方法基本和Set类似,它还有如下方法属性size:返回Map结构中的元素总数letmap=newMap()map.set('name','vuejs.cn');console.log(map.size)//1console.log(newMap([['name','vue3js.cn'],['age','18']]).size)//2操作方法set(key,value):添加或更新MapKey-valuepairget(key):读取keypair使用的value,如果没有,返回undefinedhas(key):Map对象中是否有key,返回true否则返回falsedelete(key):删除一个key,返回true,删除失败返回falseclear():删除所有元素letmap=newMap()map.set('name','vue3js.cn')map.set('age','18')console.log(map)//Map{"name"=>"vuejs.cn","age"=>"18"}map.get('name')//vue3js.cnmap.has('name')//truemap.delete('name')map.has(name)//falsemap.clear()//Map{}遍历方法keys():返回键名的遍历器values():返回键值项的遍历器():返回所有成员的遍历器forEach():遍历Map的所有成员letmap=newMap()map.set('name','vue3js.cn')map.set('age','18')console.log([...map.keys()])//["name","age"]console.log([...map.values()])//["vue3js.cn","18"]合作nsole.log([...map.entries()])//[['name','vue3js.cn'],['age','18']]//名字vuejs.cn//年龄18map.forEach((value,key)=>{console.log(key,value)})应用场景Map会保留所有元素的顺序,它建立在可迭代的基础上,如果考虑元素迭代或者保序或者key-value类型则可以用在丰富的场合。以下摘自vue3源码中依赖集合的核心实现。letdepsMap=targetMap.get(target)if(!depsMap){targetMap.set(target,(depsMap=newMap()))}letdep=depsMap.get(key)if(!dep){depsMap.set(key,(dep=newSet()))}if(!dep.has(activeEffect)){dep.add(activeEffect)activeEffect.deps.push(dep)...}WeakMapWeakMap对象是键/值对的集合,其中键被弱引用键必须是对象,值可以是任意的。与Map不同的是Map的key可以是任意类型,而WeakMap的key只能是对象类型的WeakMap键名指向的对象,不包括在垃圾回收机制中。WeakMap的属性和操作方法和Map一样,和WeakSet一样,因为是弱引用,所以WeakSet不会遍历方法类型转换MaptoArray//deconstructconstmap=newMap([[1,1],[2,2],[3,3]])console.log([...map])//[[1,1],[2,2],[3,3]]//数组.from()constmap=newMap([[1,1],[2,2],[3,3]])控制台。log(Array.from(map))//[[1,1],[2,2],[3,3]]数组转换为Mapconstmap=newMap([[1,1],[2,2],[3,3]])console.log(map)//Map{1=>1,2=>2,3=>3}MaptoObject//非字符串键名会被转换为字符串函数mapToObj(map){letobj=Object.create(null)for(let[key,value]ofmap){obj[key]=value}returnobj}constmap=newMap().set('name','vue3js.cn').set('age','18')mapToObj(map)//{name:"vue3js.cn",age:"18"}对象转换为Mapletobj={"a":1,"b":2};letmap=newMap(Object.entries(obj))SummarySet,Map,WeakSet,WeakMap都是集合数据结构Set,WeakSet是[value,value]的集合,有唯一性Map和WeakMap都是[key,value]的集合,Map的key可以是任意类型,WeakMap的key只能是对象类型Set,Map有遍历方法,WeakSet和WeakMap属于弱引用,无法遍历参考https://zh.wikipedia.org/wiki/%E5%BC%B1%E5%BC%95%E7%94%A8https://developer.mozilla.org/https://es6.ruanyifeng.com/