Set是一种在ES6中新增的数据结构,与数组不同的是其成员无重复且无序。
与Array一样,Set本身也是一个构造函数,可以从其身上new出新对象。
Set常用属性及增删改查方法:
let mySet = new Set([1, 2, 3, 2, 1]);
console.log(mySet.size); //3
console.log(...mySet); //1,2,3
mySet.add(4);
console.log(mySet.size); //4
mySet.delete(3);
console.log(mySet.size); //3
console.log(mySet.has(2)); //true
mySet.clear();
console.log(mySet.size); //0
将Set转为数组:
Array.from 方法可以将 Set 数据结构转为数组:
let mySet = new Set([1, 2, 3, 2, 1]);
console.log(mySet instanceof Array); //false
let myArr = Array.from(mySet);
console.log(myArr instanceof Array); //true
console.log(myArr); // [1,2,3]
Set集合遍历方法:
注意:遍历顺序为插入顺序
let mySet = new Set([1, 2, 3, 2, 1]);
console.log(mySet.keys());// SetIterator {1, 2, 3}
console.log(mySet.values());// SetIterator {1, 2, 3}
console.log(mySet.entries());// SetIterator {1, 2, 3}
mySet.forEach(function(i){
console.log(i+this); // 11,12,13
},10)
WeakSet 与 Set 的区别:
集合与字典的区别:
任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构都可以当作Map构造函数的参数,如下:
let Arr = [["name","jack"],["age","18"],["sex","man"]];
let myMap = new Map(Arr);
console.log(myMap.get("name")); //jack
如果传入的数组Key出现同名,键值将会被最后一个此键名的值的所覆盖,如:
let Arr = [["name","jack"],["name","Mary"],["age","18"],["sex","man"]];
let myMap = new Map(Arr);
console.log(myMap.get("name")); //Mary
特别注意: 只有对同一个对象的引用,Map 结构才将其视为同一个键。
let Arr = [[["name"],"jack"]];
let myMap = new Map(Arr);
console.log(myMap.get(["name"])); //两个["name"]在内存中的地址不一样,此处输出undefined;
这样做就没问题:
let arr1 = ["name"];
let Arr = [[arr1,"jack"]];
let myMap = new Map(Arr);
console.log(myMap.get(arr1)); //输出jack;
Map常用属性及增删改查方法:
用法如下:
let myMap = new Map();
myMap.set("name","Jack");
myMap.set("age","18"); //添加元素
console.log(myMap.size); //2
console.log(myMap.get("name"));//Jack
console.log(myMap.has("name")); //true
myMap.delete("age"); //删除
console.log(myMap.size); //1
console.log(myMap.has("age")); //false
myMap.clear(); //清空元素
console.log(myMap.size); //0
Map常用遍历方法:
Map.forEach:
let myMap = new Map();
myMap.set("name","Jack");
myMap.set("age","18");
myMap.set("sex","man");
myMap.forEach(
(value,key,map)=>{
console.log(value); //Jack,18,man
console.log(key); //name,age,sex
console.log(map); //自身,自身,自身
}
)
Map转数组:
用展开运算符:
let myMap = new Map();
myMap.set("name","Jack");
myMap.set("age","18");
myMap.set("sex","man");
console.log(...myMap); // [["name","Jack"],["age","18"],["sex","man"]];
WeakMap与Map的区别:
WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
WeakMap 中,每个键对自己所引用对象的引用都是弱引用,在没有其他引用和该键引用同一对象,这个对象将会被垃圾回收(相应的key则变成无效的),所以,WeakMap 的 key 是不可枚举的。
方法:
用法与Map一致。
Set:
WeakSet:
Map:
WeakMap: