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 更适合一些需要临时关联对象数据的场景,同时希望确保在不需要关联时能够自动释放内存的情况。