Map与Object、weakMap区别

本文介绍了Map、Object和WeakMap的区别。Map允许任意类型的键,提供了丰富的操作方法;Object的键仅限字符串,而WeakMap的键必须是对象且为弱引用,不计入垃圾回收。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

Map

Object

 WeakMa

Map

map本质上就是键值对的集合,但是普通的Object中的键值对中的键只能是字符串。而ES6提供的Map数据结构类似于对象,但是它的键不限制范围,可以是任意类型,是一种更加完善的Hash结构。如果Map的键是一个原始数据类型,只要两个键严格相同,就视为是同一个键。

实际上Map是一个数组,它的每一个数据也都是一个数组,其形式如下:

const map=new Map([[1,2],[3,4]])

数组的形式[ [1,2],[3,4] ]  类型 Map{1=>2,3=>4}

Map数据结构有以下操作方法:

  • sizemap.size 返回Map结构的成员总数。
  • set(key,value):设置键名key对应的键值value,然后返回整个Map结构,如果key已经有值,则键值会被更新,否则就新生成该键。(因为返回的是当前Map对象,所以可以链式调用)
  • get(key):该方法读取key对应的键值,如果找不到key,返回undefined。
  • has(key):该方法返回一个布尔值,表示某个键是否在当前Map对象中。
  • delete(key):该方法删除某个键,返回true,如果删除失败,返回false。
  • clear():map.clear()清除所有成员,没有返回值。

Map结构原生提供是三个遍历器生成函数和一个遍历方法

  • keys():返回键名的遍历器。
  • values():返回键值的遍历器。
  • entries():返回所有成员的遍历器。
  • forEach():遍历Map的所有成员。
  • const map = new Map([
         ["foo",1],
         ["bar",2],
    ])
    for(let key of map.keys()){
        console.log(key);  // foo bar
    }
    for(let value of map.values()){
         console.log(value); // 1 2
    }
    for(let items of map.entries()){
        console.log(items);  // ["foo",1]  ["bar",2]
    }
    map.forEach( (value,key,map) => {
         console.log(key,value); // foo 1    bar 2
    })

    Object

Object
创建对象
     const obj2 = new Object()                     
     const obj3 = Object.create(null)
 获取本身数据
     obj.id
     obj['id']
 判断某个元素是否在 object中
     obj.id===undefined
     "id" in obj
新增一个数据
      obj['key'] = value;
      obj.key = value;
删除数据
	  delete obj.id;
      obj.id = undefined
获取size
       Map 自身有 size 属性,可以自己维持 size 的变化。


Map

创建Map对象
	  const map=new Map([[1,2],[3,4]])//数组的形式[ [1,2],[3,4] ]  类型 Map{1=>2,3=>4}
获取本身数据
	  map.get(1)//2
判断某个元素是否在 Map 中可以使用
      map.has(1);
新增一个数据
      map.set(key, value)
删除数据
      var isDeleteSucceeded = map.delete(1);
      console.log(isDeleteSucceeded ); // true
// 全部删除
	 map.clear();
获取size
	  Object 则需要借助 Object.keys() 来计算
      console.log(Object.keys(obj).length); 

 WeakMap

WeakMap 对象也是一组键值对的集合,其中的键是弱引用的。其键必须是对象,原始数据类型不能作为key值,而值可以是任意的。

该对象也有以下几种方法:

  • set(key,value):设置键名key对应的键值value,然后返回整个Map结构,如果key已经有值,则键值会被更新,否则就新生成该键。(因为返回的是当前Map对象,所以可以链式调用)
  • get(key):该方法读取key对应的键值,如果找不到key,返回undefined。
  • has(key):该方法返回一个布尔值,表示某个键是否在当前Map对象中。
  • delete(key):该方法删除某个键,返回true,如果删除失败,返回false。

其clear()方法已经被弃用,所以可以通过创建一个空的WeakMap并替换原对象来实现清除。

WeakMap的设计目的在于,有时想在某个对象上面存放一些数据,但是这会形成对于这个对象的引用。一旦不再需要这两个对象,就必须手动删除这个引用,否则垃圾回收机制就不会释放对象占用的内存。

而WeakMap的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用

总结:

  • Map 数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
  • WeakMap 结构与 Map 结构类似,也是用于生成键值对的集合。但是 WeakMap 只接受对象作为键名( null 除外),不接受其他类型的值作为键名。而且 WeakMap 的键名所指向的对象,不计入垃圾回收机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值