map
# map
# WeakMap
WeakMap 对象是一组键值对的集合,其中的键是弱引用对象,而值可以是任意。
注意,WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。
WeakMap 中,每个键对自己所引用对象的引用都是弱引用,在没有其他引用和该键引用同一对象,这个对象将会被垃圾回收(相应的 key 则变成无效的),所以,WeakMap 的 key 是不可枚举的。
属性:constructor:构造函数
方法:
has(key):判断是否有 key 关联对象
get(key):返回 key 关联对象(没有则则返回 undefined)
set(key):设置一组 key 关联对象
delete(key):移除 key 的关联对象
# map 与其他数据结构的相互转换
- Map 转 Array
const map = new Map([
[1, 1],
[2, 2],
[3, 3],
]);
console.log([...map]); // [[1, 1], [2, 2], [3, 3]]
1
2
3
4
5
6
2
3
4
5
6
- Array 转 Map
const map = new Map([
[1, 1],
[2, 2],
[3, 3],
]);
console.log(map); // Map {1 => 1, 2 => 2, 3 => 3}
1
2
3
4
5
6
2
3
4
5
6
- Map 转 Object
因为 Object 的键名都为字符串,而 Map 的键名为对象,所以转换的时候会把非字符串键名转换为字符串键名。
function mapToObj(map) {
let obj = Object.create(null);
for (let [key, value] of map) {
obj[key] = value;
}
return obj;
}
const map = new Map().set("name", "An").set("des", "JS");
mapToObj(map); // {name: "An", des: "JS"}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- Object 转 Map
function objToMap(obj) {
let map = new Map();
for (let key of Object.keys(obj)) {
map.set(key, obj[key]);
}
return map;
}
objToMap({ name: "An", des: "JS" }); // Map {"name" => "An", "des" => "JS"}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
- Map 转 JSON
function mapToJson(map) {
return JSON.stringify([...map]);
}
let map = new Map().set("name", "An").set("des", "JS");
mapToJson(map); // [["name","An"],["des","JS"]]
1
2
3
4
5
6
2
3
4
5
6
- JSON 转 Map
function jsonToStrMap(jsonStr) {
return objToMap(JSON.parse(jsonStr));
}
jsonToStrMap('{"name": "An", "des": "JS"}'); // Map {"name" => "An", "des" => "JS"}
1
2
3
4
5
2
3
4
5
# 总结
# Set
成员唯一、无序且不重复
[value, value],键值与键名是一致的(或者说只有键值,没有键名)
可以遍历,方法有:add、delete、has
# WeakSet
成员都是对象
成员都是弱引用,可以被垃圾回收机制回收,可以用来保存 DOM 节点,不容易造成内存泄漏
不能遍历,方法有 add、delete、has
# Map
本质上是键值对的集合,类似集合
可以遍历,方法很多可以跟各种数据格式转换
# WeakMap
只接受对象作为键名(null 除外),不接受其他类型的值作为键名
键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收,此时键名是无效的
不能遍历,方法有 get、set、has、delete
更新时间: 10/27/2021, 2:00:56 PM