这篇文章主要介绍了ES6中的Map与Set怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ES6中的Map与Set怎么用文章都会有所收获,下面我们一起来看看吧。

Map 对象

Map 对象保存键值对。任何值(对象或者原始值) 都可以作为一个键或一个值。

Maps 和 Objects 的区别
一个 Object 的键只能是字符串或者 Symbols,但一个 Map 的键可以是任意值。
Map 中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。
Map 的键值对个数可以从 size 属性获取,而 Object 的键值对个数只能手动计算。
Object 都有自己的原型,原型链上的键名有可能和你自己在对象上的设置的键名产生冲突。
Map 中的 key

key 是字符串

varmyMap=newMap();varkeyString="astring";myMap.set(keyString,"和键'astring'关联的值");myMap.get(keyString);//"和键'astring'关联的值"myMap.get("astring");//"和键'astring'关联的值"//因为keyString==='astring'

key 是对象

varmyMap=newMap();varkeyObj={},myMap.set(keyObj,"和键keyObj关联的值");•myMap.get(keyObj);//"和键keyObj关联的值"myMap.get({});//undefined,因为keyObj!=={}

key 是函数

varmyMap=newMap();varkeyFunc=function(){},//函数myMap.set(keyFunc,"和键keyFunc关联的值");myMap.get(keyFunc);//"和键keyFunc关联的值"myMap.get(function(){})//undefined,因为keyFunc!==function(){}

key 是 NaN

varmyMap=newMap();myMap.set(NaN,"notanumber");myMap.get(NaN);//"notanumber"varotherNaN=Number("foo");myMap.get(otherNaN);//"notanumber"

虽然 NaN 和任何值甚至和自己都不相等(NaN !== NaN 返回true),NaN作为Map的键来说是没有区别的。

Map 的迭代

对 Map 进行遍历,以下两个最高级。

for…of

varmyMap=newMap();myMap.set(0,"zero");myMap.set(1,"one");//将会显示两个log。一个是"0=zero"另一个是"1=one"for(var[key,value]ofmyMap){console.log(key+"="+value);}for(var[key,value]ofmyMap.entries()){console.log(key+"="+value);}/*这个entries方法返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的[key,value]数组。*///将会显示两个log。一个是"0"另一个是"1"for(varkeyofmyMap.keys()){console.log(key);}/*这个keys方法返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的键。*///将会显示两个log。一个是"zero"另一个是"one"for(varvalueofmyMap.values()){console.log(value);}/*这个values方法返回一个新的Iterator对象,它按插入顺序包含了Map对象中每个元素的值。*/

forEach()

varmyMap=newMap();myMap.set(0,"zero");myMap.set(1,"one");//将会显示两个logs。一个是"0=zero"另一个是"1=one"myMap.forEach(function(value,key){console.log(key+"="+value);},myMap)Map 对象的操作

Map 与 Array的转换

varkvArray=[["key1","value1"],["key2","value2"]];//Map构造函数可以将一个二维键值对数组转换成一个Map对象varmyMap=newMap(kvArray);//使用Array.from函数可以将一个Map对象转换成一个二维键值对数组varoutArray=Array.from(myMap);

Map 的克隆

varmyMap1=newMap([["key1","value1"],["key2","value2"]]);varmyMap2=newMap(myMap1);console.log(original===clone);//打印false。Map对象构造函数生成实例,迭代出新的对象。

Map 的合并

varfirst=newMap([[1,'one'],[2,'two'],[3,'three'],]);varsecond=newMap([[1,'uno'],[2,'dos']]);//合并两个Map对象时,如果有重复的键值,则后面的会覆盖前面的,对应值即uno,dos,threevarmerged=newMap([...first,...second]);Set 对象

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

Set 中的特殊值

Set 对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:

+0 与 -0 在存储判断唯一性的时候是恒等的,所以不重复;
undefined 与 undefined 是恒等的,所以不重复;
NaN 与 NaN 是不恒等的,但是在 Set 中只能存一个,不重复。

代码

letmySet=newSet();mySet.add(1);//Set(1){1}mySet.add(5);//Set(2){1,5}mySet.add(5);//Set(2){1,5}这里体现了值的唯一性mySet.add("sometext");//Set(3){1,5,"sometext"}这里体现了类型的多样性varo={a:1,b:2};mySet.add(o);mySet.add({a:1,b:2});//Set(5){1,5,"sometext",{…},{…}}//这里体现了对象之间引用不同不恒等,即使值相同,Set也能存储类型转换

Array

//Array转SetvarmySet=newSet(["value1","value2","value3"]);//用...操作符,将Set转ArrayvarmyArray=[...mySet];String//String转SetvarmySet=newSet('hello');//Set(4){"h","e","l","o"}//注:Set中toString方法是不能将Set转换成StringSet 对象作用

数组去重

varmySet=newSet([1,2,3,4,4]);[...mySet];//[1,2,3,4]

并集

vara=newSet([1,2,3]);varb=newSet([4,3,2]);varunion=newSet([...a,...b]);//{1,2,3,4}

交集

vara=newSet([1,2,3]);varb=newSet([4,3,2]);varintersect=newSet([...a].filter(x=>b.has(x)));//{2,3}

差集

vara=newSet([1,2,3]);varb=newSet([4,3,2]);vardifference=newSet([...a].filter(x=>!b.has(x)));//{1}

关于“ES6中的Map与Set怎么用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“ES6中的Map与Set怎么用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。