ES6 新增 Map 是一组健值对。具有极快的查找速度 函数、对象、基本类型都可以作为键或值。** **解决了对象中只能使用 String 和 Symbol 作为键的问题 可以理解为加强型的对象
* Map 中的元素是有序的,拥有数字索引(类似数组)。每个索引对应的值是对象,该对象拥有两个属性:key 和 value
**
声明定义
new Map(array)
传递的数组是一个二维数组,二维数组中每个数组只有前两位有效,分别代表键和值*
**params**
{ array } array 二维数组**return**
{ Map }
var map = new Map(
[
["name", "zhangsan"],
["age", 18]
]
)
console.log(map); // Map { "name" => "zhangsan", "age" => 18 }
元素管理
map.size
**_desc_**
获取数量**params**
{ Map } map**return**
{ number }
var map = new Map([
["name", "zhangsan"],
["age", 18],
["sex", "male"]
]);
console.log(map.size); // 3
map.set(key, value)
* 支持链式操作
**_desc_**
添加元素**params**
{ Map } map**params**
{ any } key 键**params**
{ any } value 值**return**
{ Map } 执行添加操作后的 Map
var map = new Map();
console.log(map); // Map(0) {}
map.set("name", "zhangsan").set({ key: 0 }, 18)
console.log(map); // Map { "name" => "zhangsan", { key: 0 } => 18 }
map.get(key)
**
**_desc_**
获取值**params**
{ Map } map**params**
{ any } key 键**return**
_ { any } 根据键获取的值
var map = new Map([
["name", "zhangsan"],
["age", 18],
["sex", "male"]
]);
console.log(map.get("name")); // "zhangsan"
map.delete(key)
**
**_desc_**
删除元素**params**
{ Map } map**params**
{ any } key 键**return**
_ { boolean }
var map = new Map([
["name", "zhangsan"],
["age", 18],
["sex", "male"]
]);
map.delete("name");
console.log(map); // Map { "age" => 18, "sex" => "male" }
map.clear()
**
**_desc_**
清空 Map 中所有元素**params**
{ Map } map**return**
_ { void }
var map = new Map([
["name", "zhangsan"],
["age", 18],
["sex", "male"]
]);
map.clear();
console.log(map); // Map(0) {}
map.has(key)
**
**_desc_**
检测元素是否存在**params**
{ Map } map**params**
{ any } key 键**return**
_ { boolean }
var map = new Map([
["name", "zhangsan"],
["age", 18],
["sex", "male"]
]);
var bool = map.has("name");
console.log(bool); // true
迭代器
map.keys()
**params**
{ Map } map**return**
_ { MapIterator } 键组成的 Map 迭代对象
var map = new Map([
["name", "zhangsan"],
["age", 18]
]);
console.log(map.keys()); // MapIterator { "name", "age" }
map.values()
**params**
{ Map } map**return**
_ { MapIterator } 值组成的 Map 迭代对象
var map = new Map([
["name", "zhangsan"],
["age", 18]
]);
console.log(map.values()); // MapIterator { "zhangsan", 18 }
map.entries()
**params**
{ Map } map**return**
_ { MapIterator } 键和值组成的 Map 迭代对象
var map = new Map([
["name", "zhangsan"],
["age", 18]
]);
console.log(map.entries()); // MapIterator { "name" => "zhangsan", "age" => 18 }
数组转换
展开运算符
var map = new Map([
["name", "zhangsan"],
["age", 18]
]);
console.log([...map]); // [["name", "zhangsan"], ["age", 18]]
console.log([...map.keys()]); // ["name", "age"]
console.log([...map.values()]); // ["zhangsan", 18]
console.log([...map.entries()]); // [["name", "zhangsan"], ["age", 18]]
Array.from
var map = new Map([
["name", "zhangsan"],
["age", 18]
]);
console.log(Array.from(map)); // [["name", "zhangsan"], ["age", 18]]
console.log(Array.from(map.keys())); // ["name", "age"]
console.log(Array.from(map.values())); // ["zhangsan", 18]
console.log(Array.from(map.entries())); // [["name", "zhangsan"], ["age", 18]]
循环遍历
for of
* 先通过迭代器操作,获取 Map 迭代对象,再进行循环遍历操作
var map = new Map([
["name", "zhangsan"],
["age", 18]
]);
for(let key of map.keys()) {
console.log(key); // "name" ---> "key"
}
for(let value of map.values()) {
console.log(value); // "zhangsan" ---> 18
}
forEach
* 直接对 Map 操作,可以获取 Map 的键和值
var map = new Map([
["name", "zhangsan"],
["age", 18]
]);
map.forEach((value, key) => {
console.log(`${key}=>${value}`); // "name=>zhangsan" ---> "age=>18"
})
WeakMap**
WeakMap 是一种特殊的 Map
* 键名必须是对象,否则报错:Invalid value used as weak map key
* WeakMap 的键名是弱引用,健值是正常引用
* 垃圾回收不考虑 WeakMap 的键名,不会改变引用计数器,键在其他地方不被引用时即删除
* 因为 WeakMap 是弱引用,不可以进行 forEach 等遍历操作
*因为 WeakMap 是弱引用,WeakMap 没有迭代器方法和 size 属性
* 当键的外部引用删除时,需要自动删除数据时使用 WeakMap**
什么是弱引用? 如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存 弱引用的对象不可遍历!
new WeakMap(array)
* 传递的数组是一个二维数组,二维数组中每个数组只有前两位有效,分别代表键和值
**_desc_**
WeakMap 声明定义**params**
{ array } array 二维数组**return**
{ WeakMap }
var weakMap = new WeakMap([
[{ key: "name" }, "zhangsan"],
[{ key: "age" }, 18]
]);
console.log(weakMap); // WeakMap {{...} => 18, {...} => "zhangsan"}