Set、Map、WeakSet、WeakMap 理解与使用

Set

Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的。

注意:NaNundefined都可以被存储在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.lengthlength  属性的值为 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.lengthlength  属性的值为 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对象。

 

posted @ 2021-02-24 16:33  JS-Feng  阅读(374)  评论(0编辑  收藏  举报