se5中的set和map是开发者使用est5中的对象属性模拟出来的。Set多用于检查key是否存在,map多用于抽取数据。{letset=Object.create(null)set.foo=true;//检查属性是否存在if(set.foo){//其他操作}letmap=Object.create(null);map.foo='一个值';让val=map.foo;console.log('地图-->:',val);//map-->:avalue'}在简单的情况下使用对象作为映射和集合都是可行的,但是一旦遇到对象属性的限制就会遇到更多麻烦。{让map1=Object.create(null),key1={},key2={};map1[key1]='foo';console.log('key2-->:',map1[key2]);让map2=Object.create(null);map2.count=1;//要检查count是否存在,还是非零值?if(map2.count){//...}}map1[key1]和map1[key2]引用相同的值。因为object属性只能是string,又因为object默认的string表达形式是'[objectobject]'。使key1和key2转换为相同的字符串。map2中count的使用存在歧义。if语句中的代码将被执行,因为1被隐式转换为true。但是,计数值0将隐式转换为false。此类问题在大型应用程序中很难识别和调试。这也是新的集合和地图类型的原因。集合类型是一个没有重复值的有序列表。一组允许快速访问它包含的数字,允许更有效地跟踪各种离散值。创建集合类型使用newset()创建。调用add()方法向集合中添加元素,访问集合的size属性获取集合的个数。{让集合=新集合();设置.添加(5);set.add('5');console.log('typeofset-->:',typeofset)console.log('set-->:',set)console.log('size-->:',set.size)}set不会使用强制判断值是否重复,也就是说set可以同时包含number(5)和string(5),唯一例外-0和+0在set中被判断为相等,如果添加了多个对象对于集合,它们是相互独立的。{让集合=新集合();让key1={};让key2={};set.add(key1);set.add(key2);console.log('typeofsetobject-->:',typeofset)console.log('setobject-->:',set)console.log('size-->:',set.size)}自key1和key2不会被转成字符串,它们在setItems内部是不同的,如果转成字符串,会等于“[objectobject]”,如果多次调用add(),传递相同的值争论。随后的调用将被忽略。{让集合=新集合();设置.添加(5);set.add('5');设置.添加(5);console.log('typeofset-->:',typeofset)控制台。log('set-->:',set)console.log('size-->:',set.size)}numner(5)的第二次重复输入不会加入set集合,则该属性size的值仍然是2。你也可以使用数组来初始化一个set集合。集还过滤掉重复的值。{letset=newSet([1,2,3,4,5,5,5,5,5,5]);console.log('size-->:',set.size);}通过has()可以检测set集合中是否存在某个值。{让集合=新集合();设置.添加(5);set.add('6');console.log('sethas-->:',set.has(6));console.log('sethas-->:',set.has('6'))console.log('sethas-->:',set.has(5))console.log('sethas-->:',set.has('5'))}set集合中相同的number和sting不会返回true。调用delete()方法删除集合中的一个值,调用clear()方法删除所有值。{让集合=新集合();设置.添加(5);set.add('6');console.log('sethas-->:',set.has('6'));放。delete('6')console.log('sethas-->:',set.has('6'))console.log('size-->:',set.size)set.clear();console.log('size-->:',set.size)}set集合简单易用,可以有效跟踪多个独立有序的值。set的forEachset集合类似于数组的forEach,运行机制也类似。forEach()方法的回调接收3个参数:1.索引在集合中的位置。2.被遍历的参数值3.集合本身{letset=newSet(['a','b','c','d','e']);set.forEach((k,val,owner)=>{console.log('set-forEach-k-->:',k);console.log('set-forEach-val-->:',val);console.log('set-forEach-owner-->:',owner);})}Convertsettoarray将数组转换为set集合的过程很简单,你需要传递一个数组给设置集合。要将集合变回数组,只需使用展开运算符。{让arr=[1,2,3,4,5,5,5,5,5,5];让set=newSet(arr);让newArr=[...设置];//ps:代码行太多可以压缩letnewArr2=[...newSet([1,2,3,4,5,5,5,5,5,5])];console.log(newArr,newArr2)}创建一个地图类型地图类型是键值对的有序列表。键和值可以是任何类型。您可以调用set()方法传递一个键和一个关联的值来添加项目以奉承;然后使用键名调用get()方法获取对应的值。{让地图=新地图();map.set('title','es6');map.set('年',2016);console.log('map-title-->',map.get('title'))console.log('map-year-->',map.get('year'))}map方法map和set分享几个方法。map和set都存在以下方法和属性:1.forEach(val,k,owner):遍历map2.has(key):判断指定key是否存在3.delete(key):删除key中的keymap和对应的值4.clear():移除map中的所有键和值5.size:表示包含多个键值对。{让地图=新地图();map.set('title','es6');map.set('年',2016);map.forEach((val,k,owner)=>{console.log('map-forEach-k-->:',k);console.log('map-forEach-val-->:',val);console.log('map-forEach-owner-->:',owner);})console.log('map-size-->:',map.size);console.log('map-has-->:',map.has('title'));地图.delete('标题');console.log('地图-->:',地图);地图清晰();console.log('map-->:',map);}总结es6正式将set和map引入。以前经常使用对象进行模拟,但由于与对象属性相关的限制,这通常会出现问题。这里没有对weakset和weakmap的弱引用。如果你需要这个,你可以自己检查
