Set、Map、WeakSet和WeakMap

Set

  • Set 是ES6新增的数据结构,可以存放任意类型的值,但成员是无序且唯一.
  • Set 类似于数组,只有值没有健,或者说键名等于键值。
# 新建一个Set
let set = new Set();

# 增加一个元素
set.add(1); // 1

# 可以增加一个同值但不同类型的元素
set.add('1'); // 1 '1'

# 检测是否包含一个元素
set.has(1); //true

# 删除一个元素
set.delete(1); // 返回true, set中还有'1'

# 遍历 (遍历顺序为插入顺序)
keys()//返回一个包含集合中所有键的迭代器
values()//返回一个包含集合中所有值得迭代器
entries()//返回一个包含Set对象中所有元素得键值对迭代器
forEach(callbackFn, thisArg) // 用于对集合成员执行callbackFn操作,如果提供了 thisArg 参数,回调中的this会是这个参数,没有返回值

let set = new Set([1, 2, 3])
console.log(set.keys())	// SetIterator {1, 2, 3}
console.log(set.values())	// SetIterator {1, 2, 3}
console.log(set.entries())	// SetIterator {1, 2, 3}

for (let item of set.keys()) {
     
  console.log(item);
}	// 1	2	 3
for (let item of set.entries()) {
     
  console.log(item);
}	// [1, 1]	[2, 2]	[3, 3]

set.forEach((value, key) => {
     
    console.log(key + ' : ' + value)
})	// 1 : 1	2 : 2	3 : 3
console.log([...set])	// [1, 2, 3]


# map()和filter()方法
let set = new Set([1, 2, 3])
set = new Set([...set].map(item => item * 2))
console.log([...set])	// [2, 4, 6]

set = new Set([...set].filter(item => (item >= 4)))
console.log([...set])	//[4, 6]

WeakSet

  • 成员都是对象,不能存放值
  • 成员都是弱引用的,随时可以消失。即垃圾回收机制不考虑 WeakSet 对该对象的应用,如果没有其他的变量或属性引用这个对象值,则这个对象将会被垃圾回收掉(不考虑该对象还存在于 WeakSet 中),所以,WeakSet对象里有多少个成员元素,取决于垃圾回收机制有没有运行,运行前后成员个数可能不一致,遍历结束之后,有的成员可能取不到了(被垃圾回收了)。可以用来保存DOM节点,不容易造成内存泄漏
  • 不能遍历,方法有add、delete、has.

Map

Map和Set 的区别

  • Map存的是键值对,而Set只有键值。
  • Map增加或更新数据的方法是set。

WeakMap

在WeakMap中数据是以键值对存储,但只有对象(null 除外)才能作为键名,键值可以任意。

WeakMap中的键名是弱引用对象,若没有其他引用指向该对象,该对象将被GC回收。因此,WeakMap的key不可以遍历。

参考 :https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/6

你可能感兴趣的:(前端,javascript)