You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
letprivateData=newWeakMap();classPerson{constructor(name){privateData.set(this,{ name });}getName(){returnprivateData.get(this).name;}}letperson=newPerson('wozien');console.log(person.getName());// wozien
在es5中经常用对象来实现集合
set
和映射map
的数据结构,但是这种方式有一些弊端。比如实现集合时,我们不能用if(set.count)
判断某个元素是否确切存在。在集合中,属性5和'5'会被当作同一个键,还有不能使用对象作为键,因为会转为[object object]
。所以,es6提供了两种新的数据解构:Set
集合和Map
映射。Set集合
通过
new Set()
创建一个空的集合,通过add()
方法往集合添加元素:添加进集合的元素会自动去重,并且内部使用
Object.is()
方法来判断两个元素是否相等,但是+0和-0除外,他们在集合中被视为相等:集合可用具有迭代器接口的数据进行初始化,比如用一个数组:
另外一些集合的方法:
has(key)
: 判断某个值是否存在delete(key)
: 移除集合某一个元素clear()
: 清除集合的所有元素类似数组,集合
Set
也有forEach
方法,第一个参数为循环的函数,第二个参数为绑定这个函数的this
对象。对于循环函数的参数,第一个和第二个都为集合每个循环元素:Map映射
用
new Map()
新建一个空的映射,通过set()
方法添加键值对,get()
方法获取对应键的值:在
Map
集合中,允许对象作为键:可以向
Map
构造函数传一个数组来初始化。数组的子元素是包含键和值两个元素的数组:Map
和Set
一样拥有has(key)
,clear()
,delete(key)
三个方法,并且拥有size
属性,表示键值对的个数:WeakSet和WeakMap
WeakSet
表示弱引用集合,什么是弱引用,来看一个例子:上面的代码先在集合插入一个对象,然后把这个对象的引用obj设置
null
,清除了对该对象的引用。从集合的元素个数不变可以看出,该对象的内存并没有被回收,也就是说集合set仍然引用着这个对象,也称强引用。相对的,如果存在一种集合,在外部的引用都不存在时,集合的对象会自动被垃圾回收,该集合就可以称为对该对象的弱引用。
WeakSet
的作用就是这样:类似的,
WeakMap
叫做弱引用Map,它的键名必须为一个对象,否则会报错:WeakSet
和WeakMap
不支持clear()
和forEach()
方法。因为垃圾回收执行不能预测,所谓两者都没有size
属性。应用
利用
Set
进行数组去重:利用
WeakMap
记录DOM元素的额外信息,并随着DOM的移除自动清除:除了
Symbol
外,我们同样可以利用WeakMap
实现对象的私有属性:参考
ES6 系列之 WeakMap
The text was updated successfully, but these errors were encountered: