在对象中,如果键值设置为了数字,对象会自动把数字转换为字符串
let obj = {
1: 'hhh',
'1': 'bbb'
}
console.log(obj)
相当于创建了两个键值是字符串1的值,后面的把前面的覆盖掉,结果等同如下
let obj = {
'1': 'bbb'
}
所以如果对象赋值,同名一个字符串一个数字是不可能的,但如果遇到这种需求会怎么办呢,使用Map,Map对键值的比较是使用Object.is()
1. map.set('键名','键值') 设置值
let map = new Map()
map.set('name', 'zhou')
map.set(1, 'hh')
map.set('1', 'aa')
console.log(map) // Map(3) {"name" => "zhou", 1 => "hh", "1" => "aa"}
链式调用:
let map = new Map()
map.set('name', 'zhou').set(1, 'hh').set('1', 'aa')
console.log(map) // Map(3) {"name" => "zhou", 1 => "hh", "1" => "aa"}
键值设置为对象:
let map = new Map()
let obj = {
name: 'zhou'
}
map.set(obj, 'fang')
console.log(map)
2. map.get('键名') 取值
let map = new Map()
map.set('name', 'zhou').set(1, 'hh').set('1', 'aa')
console.log(map.get('name')) // zhou
console.log(map.get('1')) // aa
console.log(map.get(1)) // hh
3. map.has('键名') 判断是否存在
let map = new Map()
let obj = {
name: 'zhou'
}
map.set(obj, 'fang')
console.log(map.has(obj)) // true
console.log(map.has(name)) // false
4. map.delete('键名') 删除 删除成功返回true否则返回false
let map = new Map()
let obj = {
name: 'zhou'
}
map.set(obj, 'fang').set('age', 21)
console.log(map.delete(obj)) // true
console.log(map.delete('age')) // true
console.log(map.delete(name)) // false
console.log(map) // Map(0) {}
.5. map.clear() 清空map 无返回值
let map = new Map()
let obj = {
name: 'zhou'
}
map.set(obj, 'fang').set('age', 21)
map.clear()
console.log(map) // Map(0) {}
7. map.size:用于指明包含了多少对键值
console.log(map.size)
8. map初始化
可以一次性将大量数据添加到Map中,将数组传入Map构造器,该数组中每一项也必须是一个数组,内部数组的首个项会作为键,第二项为对应值。
let map = new Map([['name', 'zhou'], ['age', 21], ['sex', '女']])
console.log(map)
console.log(map.size) // 3
9. Map 遍历 (键值)
let map = new Map()
let obj = {
name: 'zhou'
}
map.set(obj, 'fang').set('age', 21)
map.forEach((value,key) => {
console.log(value,key)
})
注意key、value顺序,第一个参数是值,第二个参数是键,第三个参数是Map本身
10. WeakMap
WeakMap 也是弱引用类型,键必须是数组或对象,基本引用类型会报错。当WeakMap中的键在WeakMap之外不存在引用时,该键值对会被移除。
WeakMap至于两个方法能用来与键值交互,has() 和 delete()
也没有 forEach等操作
let map = new WeakMap()
let arr = []
map.set(arr, 'zhou')
内存引用于WeakSet相同
let Map = new WeakMap()
let element = document.getElementsByClassName('element')[0]
Map.set(element, 'Original')
console.log(Map)
element.parentNode.removeChild(element)
element = null
setInterval(() => {
console.log(Map)
}, 4000)
不会立即被垃圾回收,可看到大概8s之后,WeakMap变为空
不再可用后被销毁,能够优化内存使用并且规避内存泄漏