速卖通网站怎样做店面的二维码,全自动挂机赚钱一天40元,站长统计网站大全,网站超链接的优化如果要用一句来描述#xff0c;我们可以说
Set是一种叫做集合的数据结构#xff0c;Map是一种叫做字典的数据结构
什么是集合#xff1f;什么又是字典#xff1f;
集合
是由一堆无序的、相关联的#xff0c;且不重复的内存结构【数学中称为元素】组成的组合
字典
是… 如果要用一句来描述我们可以说
Set是一种叫做集合的数据结构Map是一种叫做字典的数据结构
什么是集合什么又是字典
集合
是由一堆无序的、相关联的且不重复的内存结构【数学中称为元素】组成的组合
字典
是一些元素的集合。每个元素有一个称作key 的域不同元素的key 各不相同
区别
共同点集合、字典都可以存储不重复的值不同点集合是以[值值]的形式存储元素字典是以[键值]的形式存储
一、Set 这里是引用 Set是es6新增的数据结构类似于数组但是成员的值都是唯一的没有重复的值我们一般称为集合
Set本身是一个构造函数用来生成 Set 数据结构 const s new Set(); 增删改查
Set的实例关于增删改查的方法
add()delete()has()clear()
add()
添加某个值返回 Set 结构本身
当添加实例中已经存在的元素set不会进行处理添加 s.add(1).add(2).add(2); // 2只被添加了一次 delete()
删除某个值返回一个布尔值表示删除是否成功 s.delete(1) has()
返回一个布尔值判断该值是否为Set的成员 s.has(2) clear()
清除所有成员没有返回值 s.clear() 遍历
Set实例遍历的方法有如下
关于遍历的方法有如下
keys()返回键名的遍历器values()返回键值的遍历器entries()返回键值对的遍历器forEach()使用回调函数遍历每个成员
Set的遍历顺序就是插入顺序
keys方法、values方法、entries方法返回的都是遍历器对象
let set new Set([red, green, blue]);for (let item of set.keys()) {console.log(item);
}
// red
// green
// bluefor (let item of set.values()) {console.log(item);
}
// red
// green
// bluefor (let item of set.entries()) {console.log(item);
}
// [red, red]
// [green, green]
// [blue, blue]forEach()用于对每个成员执行某种操作没有返回值键值、键名都相等同样的forEach方法有第二个参数用于绑定处理函数的this
let set new Set([1, 4, 9]);
set.forEach((value, key) console.log(key : value))
// 1 : 1
// 4 : 4
// 9 : 9扩展运算符和Set 结构相结合实现数组或字符串去重
// 数组
let arr [3, 5, 2, 2, 5, 5];
let unique [...new Set(arr)]; // [3, 5, 2]// 字符串
let str 352255;
let unique [...new Set(str)].join(); // 352实现并集、交集、和差集
let a new Set([1, 2, 3]);
let b new Set([4, 3, 2]);// 并集
let union new Set([...a, ...b]);
// Set {1, 2, 3, 4}// 交集
let intersect new Set([...a].filter(x b.has(x)));
// set {2, 3}// a 相对于 b 的差集
let difference new Set([...a].filter(x !b.has(x)));
// Set {1}
二、Map
Map类型是键值对的有序列表而键和值都可以是任意类型
Map本身是一个构造函数用来生成 Map 数据结构 const m new Map() 增删改查
Map 结构的实例针对增删改查有以下属性和操作方法
size 属性set()get()has()delete()clear()
size
size属性返回 Map 结构的成员总数。
const map new Map();
map.set(foo, true);
map.set(bar, false);map.size // 2set()
设置键名key对应的键值为value然后返回整个 Map 结构
如果key已经有值则键值会被更新否则就新生成该键
同时返回的是当前Map对象可采用链式写法
const m new Map();m.set(edition, 6) // 键是字符串
m.set(262, standard) // 键是数值
m.set(undefined, nah) // 键是 undefined
m.set(1, a).set(2, b).set(3, c) // 链式操作
get()
get方法读取key对应的键值如果找不到key返回undefined
const m new Map();在这里插入代码片const hello function() {console.log(hello);};
m.set(hello, Hello ES6!) // 键是函数m.get(hello) // Hello ES6!has()
has方法返回一个布尔值表示某个键是否在当前 Map 对象之中
const m new Map();m.set(edition, 6);
m.set(262, standard);
m.set(undefined, nah);m.has(edition) // true
m.has(years) // false
m.has(262) // true
m.has(undefined) // truedelete()
delete方法删除某个键返回true。如果删除失败返回false
const m new Map();
m.set(undefined, nah);
m.has(undefined) // truem.delete(undefined)
m.has(undefined) // falseclear()
clear方法清除所有成员没有返回值
let map new Map();
map.set(foo, true);
map.set(bar, false);map.size // 2
map.clear()
map.size // 0遍历
Map结构原生提供三个遍历器生成函数和一个遍历方法
keys()返回键名的遍历器values()返回键值的遍历器entries()返回所有成员的遍历器forEach()遍历 Map 的所有成员
遍历顺序就是插入顺序
const map new Map([[F, no],[T, yes],
]);for (let key of map.keys()) {console.log(key);
}
// F
// Tfor (let value of map.values()) {console.log(value);
}
// no
// yesfor (let item of map.entries()) {console.log(item[0], item[1]);
}
// F no
// T yes// 或者
for (let [key, value] of map.entries()) {console.log(key, value);
}
// F no
// T yes// 等同于使用map.entries()
for (let [key, value] of map) {console.log(key, value);
}
// F no
// T yesmap.forEach(function(value, key, map) {console.log(Key: %s, Value: %s, key, value);
});三、WeakSet 和 WeakMap
WeakSet
创建WeakSet实例 const ws new WeakSet(); WeakSet可以接受一个具有 Iterable接口的对象作为参数
const a [[1, 2], [3, 4]];
const ws new WeakSet(a);
// WeakSet {[1, 2], [3, 4]}在API中WeakSet与Set有两个区别
没有遍历操作的API没有size属性
WeakSet只能成员只能是引用类型而不能是其他类型的值
let wsnew WeakSet();// 成员不是引用类型
let weakSetnew WeakSet([2,3]);
console.log(weakSet) // 报错// 成员为引用类型
let obj1{name:1}
let obj2{name:1}
let wsnew WeakSet([obj1,obj2]);
console.log(ws) //WeakSet {{…}, {…}}WeakSet里面的引用只要在外部消失它在 WeakSet里面的引用就会自动消失
WeakMap
WeakMap结构与Map结构类似也是用于生成键值对的集合
在API中WeakMap与Map有两个区别
没有遍历操作的API没有clear清空方法
// WeakMap 可以使用 set 方法添加成员
const wm1 new WeakMap();
const key {foo: 1};
wm1.set(key, 2);
wm1.get(key) // 2// WeakMap 也可以接受一个数组
// 作为构造函数的参数
const k1 [1, 2, 3];
const k2 [4, 5, 6];
const wm2 new WeakMap([[k1, foo], [k2, bar]]);
wm2.get(k2) // barWeakMap只接受对象作为键名null除外不接受其他类型的值作为键名
const map new WeakMap();
map.set(1, 2)
// TypeError: 1 is not an object!
map.set(Symbol(), 2)
// TypeError: Invalid value used as weak map key
map.set(null, 2)
// TypeError: Invalid value used as weak map keyWeakMap的键名所指向的对象一旦不再需要里面的键名对象和所对应的键值对会自动消失不用手动删除引用
举个场景例子
在网页的 DOM 元素上添加数据就可以使用WeakMap结构当该 DOM 元素被清除其所对应的WeakMap记录就会自动被移除
const wm new WeakMap();const element document.getElementById(example);wm.set(element, some information);
wm.get(element) // some information注意WeakMap 弱引用的只是键名而不是键值。键值依然是正常引用
下面代码中键值obj会在WeakMap产生新的引用当你修改obj不会影响到内部
const wm new WeakMap();
let key {};
let obj {foo: 1};wm.set(key, obj);
obj null;
wm.get(key)
// Object {foo: 1}