当前位置: 首页 > 科技观察

JavaScript中的Map、WeakMap、Set和WeakSet简介

时间:2023-03-15 14:27:32 科技观察

我猜超过70%的JavaScript开发人员仅使用对象来收集和维护项目中的数据。没错,像Map和Set这样的新集合对象虽然在2015年问世,但并未得到充分利用。因此,今天,我将讨论2015年的惊人新功能-Map、Set、WeakMap和WeakSet。在阅读这篇文章之前并不是要告诉你你只能使用它们。但我见过一些考生在编码考试中使用其中一种,我喜欢在某些情况下使用它们。何时在项目中使用它们由您决定。您应该知道什么是可迭代对象,以便更好地理解我的讨论。对象我们应该首先讨论如何使用对象。嗯,我敢肯定超过90%的人已经知道这部分,因为您点击这篇文章是为了了解新的集合对象,但是对于JavaScript初学者,让我们简单地谈谈它们。constalgorithm={site:"leetcode"};console.log(algorithm.site);//leetcodefor(constkeyinalalgorithm){console.log(key,algorithm[key]);}//siteleetcodedeletealgorithm.site;console.log(algorithm.site);//undefined所以我做了一个algorithm对象,它的key和value都是string类型的值,我通过.关键词。此外,for-in循环非常适合遍历对象。您可以使用[]关键字访问与其键对应的值。但是你不能使用for-of循??环,因为对象是不可迭代的。可以使用delete关键字删除对象属性。这样就可以完全去掉对象的属性,注意不要和这个方法搞混了。constalgorithm={site:"leetcode"};//Propertyisnotremoved!!algorithm.site=undefined;//Propertyisremoved!!deletealgorithm.site;algorithm.site=undefined只是将新值赋给site。好的,我们已经快速讨论了一些关于对象的事情:如何添加属性如何迭代对象如何删除属性MapMap是JavaScript中新的集合对象,其功能类似于对象。但是,与常规对象相比,存在一些主要差异。首先,让我们看一个创建Map对象的简单示例。/如何添加属性/constmap=newMap();//Map(0){}Map不需要创建任何东西,只是以稍微不同的方式添加数据。map.set('name','john');//Map(1){"name"=>"john"}Map有一个特殊的方法,它添加一个名为set的属性。它有两个参数:键是第一个参数,值是第二个参数。map.set('phone','iPhone');//地图(2){"name"=>"john","phone"=>"iPhone"}map.set('phone','iPhone');//Map(2){"name"=>"john","phone"=>"iPhone"}但是,它不允许您在其中添加现有数据。如果新数据的key对应的值已经存在于Map对象中,则不会添加新数据。map.set('phone','Galaxy');//Map(2){"name"=>"john","phone"=>"Galaxy"}但是您可以用其他值覆盖现有数据。/如何迭代对象/Map是一个可迭代对象,这意味着它可以使用for-of语句进行映射。for(constitemofmap){console.dir(item);}//Array(2)["name","john"]//Array(2)["phone","Galaxy"]需要记住的一件事是Map提供数组形式的数据,您应该解构数组或访问每个索引以获取键或值。要仅获取键或值,您还可以使用一些方法。map.keys();//MapIterator{"name","phone"}map.values();//MapIterator{"john","Galaxy"}map.entries();//MapIterator{"name"=>"john","phone"=>"Galaxy"}您甚至可以使用展开运算符(...)来获取地图的全部数据,因为展开运算符还在幕后处理可迭代对象。constsimpleSpreadedMap=[...map];//[Array(2),Array(2)]/如何删除属性//从Map对象中删除数据也很简单,您需要做的就是调用delete。map.delete('phone');//truemap.delete('fake');//falsedelete返回一个布尔值,表示删除函数是否成功删除数据。如果是则返回true,否则返回false。WeakMapWeakMap是从Map派生出来的,所以它们彼此非常相似。然而,WeakMap是完全不同的。WeakMap是如何得名的?好吧,因为它与其引用链接指向的数据对象的连接或关系不如Map的连接或关系强,所以它很弱。那么,这到底是什么意思呢?/区别1:key必须是对象/constJohn={name:'John'};constweakMap=newWeakMap();weakMap.set(John,'student');//WeakMap{{...}=>"student"}weakMap.set('john','student');//UncaughtTypeError:Invalidvalueusedasweakmapkey你可以将任何值作为键传递给一个Map对象,但是WeakMap不同,它只接受一个对象作为键,否则,它返回一个错误。/区别二:Map中的方法并非全部支持/可以使用WeakMap的方法如下。deletegethasset题目最大的不同是WeakMap不支持迭代对象的方法。但为什么?这在下面描述。/区别3:GC清理引用时,数据会被删除/与Map相比,这是最大的区别。letJohn={major:"math"};constmap=newMap();constweakMap=newWeakMap();map.set(John,'John');weakMap.set(John,'John');John=null;/*Johnisgarbagecollected*/当John对象被垃圾回收时,Map对象会保留引用链接,而WeakMap对象会失去链接。所以当你使用Wea??kMap时,你应该考虑这个特性。SetSet也与Map非常相似,但Set对单个值更有用。/如何添加属性/constset=newSet();set.add(1);set.add('john');set.add(BigInt(10));//Set(4){1,"john",10n}和Map一样,Set也不允许我们添加相同的值。set.add(5);//Set(1){5}set.add(5);//Set(1){5}/如何遍历对象/由于Set是一个可迭代对象,你可以使用for-of或forEach语句。for(constvalofset){console.dir(val);}//1//'John'//10n//5set.forEach(val=>console.dir(val));//1//'John'//10n//5/如何删除属性/这部分和Map的删除完全一样。如果数据删除成功返回true,否则返回false。set.delete(5);//trueset.delete(function(){});//假;如果您不想将相同的值添加到数组形式,Set会很有用。/*WithSet*/constset=newSet();set.add(1);set.add(2);set.add(2);set.add(3);set.add(3);//设置{1,2,3}//ConvertingtoArrayconstarr=[...set];//[1,2,3]Object.prototype.toString.call(arr);//[objectArray]/*WithoutSet*/consthasSameVal=val=>ar.some(v===val);constar=[];if(!hasSameVal(1))ar.push(1);if(!hasSameVal(2))ar.push(2);if(!hasSameVal(3))ar.push(3);WeakSet与WeakMap一样,WeakSet也将无法访问内部数据(如果内部数据已被垃圾收集)。letJohn={major:"math"};constset=newSet();constweakSet=newWeakSet();set.add(John);//Set{{...}}weakSet.add(John);//WeakSet{{...}}John=null;/*John被垃圾回收*/一旦对象John被垃圾回收,WeakSet就无法访问它引用John的数据。并且WeakSet不支持for-of或forEach,因为它不可迭代。比较总结相似点:不支持添加相同的值。Mapvs.WeakMap:WeakMap只接受对象作为键,而Map不接受。Map和Set:可迭代对象,支持脱离GC关系的for..of、forEach或...运算符WeakMap和WeakSet:不是可迭代对象,不能循环。如果引用的数据被垃圾收集,则无法访问该数据。支持的方法较少。结论然而,我认为许多团队或公司仍然不使用Maps或Sets。也许是因为他们觉得没有必要,或者因为数组仍然可以做他们想做的几乎所有事情。然而,在JavaScript中,Maps或Sets可以是非常独特和强大的东西,这取决于每种情况。所以我希望有一天,您将有机会使用它们。