【JS】Map和Set

数据集合

  • 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() 方法返回弱映射实例,因此可以链式调用

在这里插入图片描述

WeakSet方法

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值