map数据类型

Map基本用法

js对象,本质上是键值对的集合(Hash结构),传统上只能用字符串做键值,给使用带来限制;
为了解决之歌问题,es6提供了Mao结构;
类似于对象,也是键值对的集合,但是键值不限于字符串,各种类型都可以做键值。

const m = new Map();
const o = {p: 'Hello World'};

m.set(o, 'content')
m.get(o) // "content"

m.has(o) // true
m.delete(o) // true
m.has(o) // false

代码中使用Map结构的set方法,将对象o当做m的一个键,然后又使用get方法读取这个键,接着使用delete删除了这个键

作为构造函数,Map可以接受数组作为参数。该数组的成员是一个个表示键值对的数组

const map = new Map([
  ['name', '张三'],
  ['title', 'Author']
]);

map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"

Map构造函数接受数组作为参数,实际上执行的是下面的算法。

const items = [
  ['name', '张三'],
  ['title', 'Author']
];

const map = new Map();

items.forEach(
  ([key, value]) => map.set(key, value)
);

实例属性和方法

1.size: 返回Map结构成员总数
2.set(key, value) : 设置键名key对应的键值为value,返回整个Map结构,如果存在key,更新键值
3.get(key): 读取key对应键值,如果没有返回undefined
4.has(key):返回一个布尔值,表示是否在当前Map对象中
5.delete(key): 删除某个键,删除成功返回true,失败false
6.clear(): 清除掉所有成员,没有返回值

遍历方法

1.keys()
2.values()
3.entries()
4.forEach()

遍历的就是插入顺序

Map与其他数据类型装换

1.map转数组

var map = new Map([
  ['a','A']
]);
var a = [...map];

2.数组转map
将数组传入 Map 构造函数,就可以转为 Map

  new Map([
    [true, 7],
    [{foo: 3}, ['abc']]
  ])

3.Map转对象
如果所有Map键值都是字符串,可以无损转为对象
如果如果有非字符串的键名,那么这个键名会被转成字符串,再作为对象的键名

遍历Map给对象赋值即可

4.对象转map
遍历对象给map赋值

var a = {
  x:1,
  y:2
}
var map = new Map()
for(let i in a){
  map.set(i,a[i])
}

// Map(2) {"x" => 1, "y" => 2}

weakMap

和Map两个区别:
1.只接受Object作为键名

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 key

2.键名所指向的对象,弱引用,不计入垃圾回收机制
只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。
也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用

api上的区别: 没有遍历操作,没有size属性

使用场景:DOM节点作为键名

你可能感兴趣的:(map数据类型)