Set、Map、WeakSet和WeakMap

    技术2022-07-10  146

    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

    Processed: 0.011, SQL: 9