Map、WeakMap和set、WeakSet

本文介绍了JavaScript中的Map、WeakMap、Set和WeakSet数据结构,包括它们的创建方式、主要属性和方法,以及在Node.js中关于内存使用和垃圾回收的示例。
摘要由CSDN通过智能技术生成

Map

map是一个键名和键值可以是任意类型的键值对集合,它按照键值对的插入顺序来排列,如果给同一个键名插入键值,后者会覆盖前者

let map = new Map()
map.set(1, 1)
map.set('string', 'string')
map.set({'1': '1'}, {'1': '1'})
console.log(map)

在这里插入图片描述

可以通过给Map构造函数传入一个二位数组作为键值对集合初始化一个map结构的变量

let map = new Map([[1,2],[3,4]])

Map的属性和方法

let map = new Map([[1,2],[3,4]])
map.set('1',2)
map.get('1')
map.size
map.delete('1')
map.entries()
map.has(1)
map.keys()
map.values()
map.clear()

WeakMap

WeakMap结构与Map结构类似,也是用于生成键值对的集合。只接受对象(null除外)和 Symbol 值作为键名,不接受其他类型的值作为键名。

在这里插入图片描述

WeakMap的属性和方法

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) // "bar"

键名对象的引用也只是弱引用,若外部没有这个对象的强引用,那么这个对象随时有可能会被垃圾回收,所以weakMap不可枚举,不可清空,也没有size属性。

const wm = new WeakMap();
// size、forEach、clear 方法都不存在
wm.size // undefined
wm.forEach // undefined
wm.clear // undefined

node执行查看内存变化

function formatByte(bytes) {
  return (bytes/1024/1024).toFixed(2) + 'MB'
}

function print () {
  global.gc()
  let memoryUsage = process.memoryUsage()
  console.log(formatByte(memoryUsage.heapUsed));
}

let map = new Map()
print()
let arr = new Array(1024*1024)
map.set(arr, '1')
print()
arr = null
print()

global.gc()会执行一次垃圾回收,需要在使用node命令是加上–expose-gc参数

在这里插入图片描述

let weakMap = new WeakMap()
print()
let arr = new Array(1024*1024)
weakMap.set(arr, '1')
print()
arr = null
print()

在这里插入图片描述

set

不重复的类数组集合,成员可以是任何类型并且是唯一的。在Set中两个对象总是不相等的,原因是对象是引用值,存储地址不同。

set的属性和方法

let set = new Set()
set.add('1') // 添加某个值,返回Set结构本身。
set.has('1') // 返回一个布尔值
set.delete('1') // 返回一个布尔值
set.clear() // 清除所有成员,没有返回值
set.size
set.entries()
set.keys()
set.values()
set.forEach()

使用实例

数组去重

let arr = [...new Set([1,1,2,2,3])]

WeakSet

不重复集合,成员只能是对象和 Symbol 值,而不能是其他类型的值,也属于弱引用,特性基本与weakMap相同。

WeakSet的属性和方法

const ws = new WeakSet();
const obj = {};
const foo = {};

ws.add(window); // 向 WeakSet 实例添加一个新成员,返回 WeakSet 结构本身。
ws.add(obj); 

ws.has(window); // true,返回一个布尔值,表示某个值是否在 WeakSet 实例之中。
ws.has(foo); // false

ws.delete(window); // true,清除 WeakSet 实例的指定成员,返回一个布尔值。
ws.has(window); // false

WeakSet 没有size属性,没有办法遍历它的成员。

ws.size // undefined
ws.forEach // undefined

ws.forEach(function(item){ console.log('WeakSet has ' + item)})
// TypeError: undefined is not a function

使用实例

const foos = new WeakSet()
class Foo {
  constructor() {
    foos.add(this)
  }
  method () {
    if (!foos.has(this)) {
      throw new TypeError('Foo.prototype.method 只能在Foo的实例上调用!');
    }
  }
}

上面代码确保了Foo类的实例方法只能在Foo的实例上调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值