Set、Map、WeakSet、WeakMap 理解与使用
Set
Set
对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。
Set
对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。
注意:NaN
和undefined
都可以被存储在Set 中, NaN
之间被视为相同的值(NaN被认为是相同的,尽管 NaN !== NaN)
属性:
Set.prototype.size 返回 Set 对象中的值的个数
方法:
Set.prototype.add(value)
在Set
对象尾部添加一个元素。返回该Set
对象
Set.prototype.clear()
移除Set
对象内的所有元素
Set.prototype.delete(value)
移除Set
中与这个值相等的元素
Set.prototype.has(value)
返回一个布尔值,表示该值在Set
中存在与否
Set.prototype.values()
返回一个新的迭代器对象,该对象包含Set
对象中的按插入顺序排列的所有元素的值
Set.prototype.keys()
与values()
方法相同,返回一个新的迭代器对象,该对象包含Set
对象中的按插入顺序排列的所有元素的值。
Set.prototype.entries()
返回一个新的迭代器对象,该对象包含Set
对象中的按插入顺序排列的所有元素的值的[value, value]
数组。为了使这个方法和Map
对象保持相似, 每个值的键和值相等
Set.prototype.forEach(callbackFn[, thisArg])
按照插入顺序,为Set对象中的每一个值调用一次callBackFn。如果提供了thisArg
参数,回调中的this
会是这个参数
let mySet = new Set() mySet.add("first") mySet.add([1,2]) mySet.add({name:18}) mySet.add("first") // mySet.delete("first") console.log(mySet.size) console.log(mySet.has("first")) console.log(mySet.entries()) console.log(mySet.keys()) console.log(mySet.values()) console.log(mySet) mySet.forEach(e=>{ console.log(e) })
set对象和数组相互转换
let myArray = ["value1", "value2", "value3"]; let mySet = new Set(myArray); let newArray = [...mySet]
数组去重
let arr = [1,2,3,2] let newArr = [...new Set(arr)]
WeakSet
WeakSet
对象允许你将弱保持对象存储在一个集合中。
WeakSet
对象是一些对象值的集合, 并且其中的每个对象值都只能出现一次。在WeakSet
的集合中是唯一的
它和 Set
对象的区别有两点:
- 与
Set
相比,WeakSet
只能是对象的集合,而不能是任何类型的任意值。 WeakSet
持弱引用:集合中对象的引用为弱引用。 如果没有其他的对WeakSet
中对象的引用,那么这些对象会被当成垃圾回收掉。 这也意味着WeakSet中没有存储当前对象的列表。 正因为这样,WeakSet
是不可枚举的。
属性:
WeakSet.length
length
属性的值为 0
方法:
WeakSet.prototype.add(value)
在该 WeakSet
对象中添加一个新元素 value
WeakSet.prototype.delete(value)
从该 WeakSet
对象中删除 value
这个元素, 之后 WeakSet.prototype.has(value)
方法便会返回 false
WeakSet.prototype.has(value)
返回一个布尔值, 表示给定的值 value
是否存在于这个 WeakSet
中
let myWeakSet = new WeakSet() let a = {name:1} let b = {age:"22"} myWeakSet.add(a) myWeakSet.add(b) myWeakSet.add({sex:[1,2]}) console.log(myWeakSet.has(a)) myWeakSet.delete(b) console.log(myWeakSet)
map
Map
对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。
一个Map对象在迭代时会根据对象中元素的插入顺序来进行 — 一个 for...of
循环在每次迭代后会返回一个形式为[key,value]的数组。
注意:键 NaN
是与 NaN
相等的(虽然 NaN !== NaN
)
属性:
Map.length
属性 length 的值为 0 ,想要计算一个Map
中的条目数量, 使用 Map.prototype.size
.
方法:
Map.prototype.get(key)
返回键对应的值,如果不存在,则返回undefined。
Map.prototype.has(key)
返回一个布尔值,表示Map实例是否包含键对应的值。
Map.prototype.set(key, value)
设置Map对象中键的值。返回该Map对象。
Map.prototype.delete(key)
如果 Map
对象中存在该元素
Map.prototype.clear()
移除Map对象的所有键/值对 。
Map.prototype.keys()
返回一个新的 Iterator
对象, 它按插入顺序包含了Map对象中每个元素的键 。
Map.prototype.values()
返回一个新的Iterator
对象,它按插入顺序包含了Map对象中每个元素的值 。
Map.prototype.entries()
返回一个新的 Iterator
对象,它按插入顺序包含了Map对象中每个元素的 [key, value]
数组
。
Map.prototype.forEach(callbackFn[, thisArg])
按插入顺序,为 Map
对象里的每一键值对调用一次callbackFn函数。如果为forEach提供了thisArg,它将在每次回调中作为this值。
let myMap = new Map(); let keyObj = {}; let keyFunc = function() {}; let keyString = 'a string'; // 添加键 myMap.set(keyString, "和键'a string'关联的值"); myMap.set(keyObj, "和键keyObj关联的值"); myMap.set(keyFunc, "和键keyFunc关联的值"); myMap.size; // 3 // 读取值 myMap.get(keyString); // "和键'a string'关联的值" myMap.get(keyObj); // "和键keyObj关联的值" myMap.get(keyFunc); // "和键keyFunc关联的值" myMap.get('a string'); // "和键'a string'关联的值" // 因为keyString === 'a string' myMap.get({}); // undefined, 因为keyObj !== {} myMap.get(function() {}); // undefined, 因为keyFunc !== function () {}
使用forEach迭代
myMap.forEach(function(value, key) { console.log(key + " = " + value); })
与数组关系
let kvArray = [["key1", "value1"], ["key2", "value2"]]; // 使用常规的Map构造函数可以将一个二维键值对数组转换成一个Map对象 let myMap = new Map(kvArray); myMap.get("key1"); // 返回值为 "value1" // 使用Array.from函数可以将一个Map对象转换成一个二维键值对数组 console.log(Array.from(myMap)); // 输出和kvArray相同的数组 // 更简洁的方法来做如上同样的事情,使用展开运算符 console.log([...myMap]); // 或者在键或者值的迭代器上使用Array.from,进而得到只含有键或者值的数组 console.log(Array.from(myMap.keys())); // 输出 ["key1", "key2"]
WeakMap
WeakMap
对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。
WeakMap 的 key 只能是 Object
类型。
属性:
WeakMap.length
length
属性的值为 0。
方法:
WeakMap.prototype.delete(key)
移除key的关联对象。执行后 WeakMap.prototype.has(key)返回
false。
WeakMap.prototype.get(key)
返回key关联对象
, 或者 undefined
(没有key关联对象时)。
WeakMap.prototype.has(key)
根据是否有key关联对象返回一个Boolean值。
WeakMap.prototype.set(key, value)
在WeakMap中设置一组key关联对象,返回这个 WeakMap
对象。