持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
Map对象
Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值。
Map和object的不同:
- Map在默认情况下不包含任何键值,只包含显示添加的键值。object有一个原型,它的键值会受到原型上的键名影响。
- Map的键值可以是任意值,包括函数、对象或任意基本类型。但是object的键值必须是string或symbol。
- Map对象可以直接获取到size,而object是不能直接获取到的。
- Map是可迭代的,所以它能被直接迭代,即可以使用for...of表达式,object并没有实现迭代协议,所以它不能使用for...of, 可以使用 for...in表达式允许你迭代一个对象的可枚举属性。 注:迭代即迭代协议。迭代协议分为:可迭代协议和迭代器协议。可迭代协议允许 JavaScript 对象定义或定制它们的迭代行为,例如,在一个for..of 结构中,哪些值可以被遍历到。要成为可迭代对象, 一个对象必须实现 @@iterator 方法。这意味着对象(或者它原型链上的某个对象)必须有一个键为@@iterator的属性。
Map对象上的一些方法
- set(key,value),在Map对象中设置与指定的键key关联的值value,并返回Map对象。
- has(key),判断Map对象上是否存在某个键值,存在返回true,不存在返回false。
- get(key),获取Map对象上键值key的值,存在返回value,不存在返回undefined。
- delete(key),删除指定的键值对,如果键值存在并成功删除返回true否者返回false
- clear(),清除所有的键值对。
const map1 = new Map();
map1.set('a', 1);
map1.set('b', 2);
console.log(map1.size); // 2
for(let e of map1){
console.log(e); // ['a',1],['b',2]
}
WeakMap对象
WeakMap对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。
Map和WeakMap的不同
- 原生的WeakMap持有的是每个键对象的“弱引用”,这意味着在没有其他引用存在时垃圾回收能正确进行。而Map则不能。
- WeakMap的 key 是不可枚举的。
WeakMap对象上的一些方法
- set(key,value),在Map对象中设置与指定的键key关联的值value,并返回WeakMap对象。
- has(key),判断Map对象上是否存在某个键值,存在返回true,不存在返回false。
- get(key),获取Map对象上键值key的值,存在返回value,不存在返回undefined。
- delete(key),删除指定的键值对,如果键值存在并成功删除返回true否者返回false
const map1 = new WeakMap();
let a = {}
let b = {}
map1.set(a, 1);
map1.set(b, 2);
var val = map1.get(a) // val = 1