数据集合
Object
:键只能是字符串或Symbol
,否则转换;值可以是任意数据类型;并且在内部会进行自动排序Array
:键为有序的数字字符串,值可以是任意数据类型
以下四个查找键名时使用
SameValueZero
比较(类似于严格相等,但识别NaN)
Map
:键和值都可以是任意数据类型,顺序为录入顺序Set
:值可以为任意类型,去重WeakSet
:值只能是对象,弱引用WeakMap
:键只能是对象,值任意类型,弱引用
Map
const m = new Map();
-
Map 会保留键值对的插入顺序
-
参数:可迭代对象,键值对形式
const m1 = new Map([ ["key1", "val1"], ["key2", "val2"], ["key3", "val3"] ]);
const m2 = new Map({ [Symbol.iterator]: function*() { yield ["key1", "val1"]; yield ["key2", "val2"]; yield ["key3", "val3"]; } });
-
对比Object的优点
-
插入性能
-
查找速度
-
删除性能
-
属性与方法
- entries() 是默认迭代器
- 自动获取迭代器Symbol.iterator()
Map与对象的转换
-
对象->
Map
let map = new Map(Object.entries(obj));
-
Map
->对象Object.fromEntries()
参数期待为迭代对象,所以可以简写let obj = Object.fromEntries(map);
Set
- 去重
- 参数:数组(或者具有
iterable
接口的其他数据结构) Set
没有键名,只有键值Set
转数组:Array.from()
…rest
强引用
//obj建立引用
let obj = {
name: 'tom'
}
let obj1=obj;//obj1建立引用
//------此时obj和obj1都指向这块地址----
obj=null; //obj断开引用
console.log(obj1);//但是obj1还在引用,所以无法触发回收机制
- 回顾数据类型引用:
- 对于原始类型,是值的引用
- 对于引用类型,是地址的引用
- 垃圾回收机制:会定期的查找不使用的变量并释放
- 只要该引用还存在,垃圾回收机制就不会触发
- 通过null可以触发回收机制,但如果引用过多,就会容易疏忽,导致内存泄漏
弱引用
-
如果没有其他引用,弱引用会再代码结束后,被垃圾回收
const wm = new WeakMap(); wm.set({}, "val");//执行结束,{}会被回收
const wm = new WeakMap(); const container = { //维护引用 key: {} }; wm.set(container.key, "val");//不会回收
-
常用于解决内存泄漏问题:
- 操作Dom时,获取了太多dom节点,dom不使用时,还存在
- 使用闭包时,变量会一直存在
let obj = { name: 'tom'};
let oo=obj
//引用了同一块地址
let s=new Set()
s.add(obj) //强引用
//手动回收两个强引用
obj=null;
oo=null;
//获取s,有值
let obj = { name: 'tom'};
let oo=obj
//引用了同一块地址
let s=new WeakSet()
s.add(obj) //弱引用
//手动回收两个强引用
obj=null;
oo=null;
//获取s,自认为会有值,但其实没有了
//等垃圾回收后,彻底没有了,这就是弱引用
WeakMap方法
- set() 方法返回弱映射实例,因此可以链式调用