JS数据结构Map,和Object,WeakMap的区别

map和object的区别

键的类型

Map:可以使用任何数据类型作为键,包括原始类型(例如字符串、数字)和对象引用等。

  let map = new Map()
  map.set('name', '小明')
  map.set(1, 'a')
  map.set([1, 2, 3], 'b')
  map.set({ name: '小明', age: '18' }, 'c')
  console.log('map', map);

在这里插入图片描述

Object:对象的键只能是字符串或 Symbols。如果尝试使用其他数据类型作为键,它们将被强制转换为字符串。

  let obj = {
    name: '小明',
    age: '18',
  }
  console.log('obj', obj)

输出:在这里插入图片描述
ps:如果你把对象的key写为数字类型,JavaScript 在处理这种情况时会将数字键隐式转换为字符串,比如,然后用obj[num]来调用,但是不建议在把对象的key写为数字

  let obj = {
    name: '小明',
    age: '18',
    1: 'a'
  }
  console.log('obj', obj[1]) //a

键的顺序

Map:保留插入顺序,键值对按照插入的顺序存储。
Object:Object 的键是无序的

  let obj = {
    c: 1,
    a: 2,
    b: 3
  }
  console.log('obj', obj)

  
  let map = new Map()
  map.set('c', 1)
  map.set('a', 1)
  map.set('b', 1)
  console.log('map', map);

在这里插入图片描述
打印结果可以看出,对象的key是按照其ascode码来排序的,而map是按照插入顺序进行排序的

大小

Map:有一个内建的 size 属性,用于获取 Map 中键值对的数量。
Object:没有内建的属性来获取对象中属性的数量。你需要手动计算或使用循环来统计。## 二级目录

  let obj = {
    c: 1,
    a: 2,
    b: 3
  }
  // 获取对象元素个数,需要借助Object.keys()方法
  const keyCount = Object.keys(obj).length
  console.log(keyCount) // 输出:3

  let map = new Map()
  map.set('c', 1)
  map.set('a', 2)
  map.set('b', 3)
  // 获取map元素个数,可以直接调用size方法
  console.log(map.size) // 输出:3 

使用场景

Map 适用于需要使用非字符串键、保留插入顺序或需要直接获取键值对数量的情况。
Object 常用于创建普通的数据结构,通常作为字典或哈希表使用,但键必须是字符串或 Symbols。

map和WeakMap的区别

Map:

  • 可以使用任何 JavaScript 对象作为键(包括原始类型、对象引用等)。
  • 不会妨碍键的垃圾回收。即使不再使用键,Map 中的引用也会保持,不会被自动回收。
  • 适用于需要保留键和值之间关联关系的场景,并且不需要担心内存泄漏。

WeakMap:

  • 只能使用对象作为键,不能使用原始类型(如字符串、数字等)。
  • 不会阻止键的垃圾回收。如果没有其他引用指向键对象,WeakMap 中的条目可能会被自动删除以释放内存。
  • 主要用于在不会导致内存泄漏的情况下建立临时关联,例如,你可以将键与对象的私有数据相关联,而无需担心垃圾回收问题。

主要区别在于 Map 可以使用各种键类型,而 WeakMap 只能使用对象作为键,并且对于键的垃圾回收行为有不同的处理方式。 WeakMap 更适合一些需要临时关联对象数据的场景,同时希望确保在不需要关联时能够自动释放内存的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值