Set & WeakSet
类似于数组, 成员唯一且无序, 没有重复值
-
set.add(val)
- 向set中添加值的时候, 不会发生类型转换, 使用精确相等===, 区别是NaN等于自身无法重复添加
-
WeakSet 对象允许将弱引用对象存储在集合中, 与Set的区别
- WeakSet只能存储对象引用, 不能存放值, 而Set对象可以
- WeakSet中存储的对象值, 垃圾回收机制不会考虑WeakSet对该值的引用, 如果该对象没有被其他变量或者属性引用, 那么该对象就会被垃圾回收机制回收掉, 此时WeakSet中也会没有该对象, 所以WeakSet中有多少个成员格式可能不一致, 取决于垃圾回收机制有没有运行, 运行前后的成员个数可能不一致
- 基于上述, WeakSet不能获取size和不能遍历, 同时clear()方法也废弃了
var ws = new WeakSet(); var obj = { o: '1' }; var foo = { bar: 1 }; ws.add(window); window.obj = obj; ws.add(obj); ws.has(window); // true ws.has(foo); // 因为没有被用到, 被垃圾回收机制回收了, false ws.has(obj); // 被window引用了, 没有被垃圾回收, true ws.delete(window); // true ws.has(window); // false
Map & HashMap
-
map与set的区别
- 共同点:
- set, Map可以存储不重复的值
- 都可以遍历, 有iterator接口
- 不同点:
- set是以[value1, value2] 的形式存储, map是以 [[key,value]]的形式存储
- 共同点:
-
WeakMap
- WeakMap实例是一组键值对的集合, 键是弱引用对象, 而值可以是任意, WeakMap弱引用的只是键名key, 而不是键值
- 键名是弱引用对象, 所以WeakMap同样不能遍历
-
Object与Map
- 对象的键值类型只能是字符串, 而Map则提供了任意类型的键值对应关系