在es6中新增了两个对象 Map和Set
Map也是键值对一个集合,它的键可以是任意值 Map对象和Object的区别:
- Map对象的键可以是任意值,Object的键只能是字符串或者Symbols
- Map对象的键值个数可以从size属性中获取,而Object的键值个数只能通过计算得到
- Map中的键值是有序的,而Object中的键值则不是
Map的方法
// 初始化一个Map对象
let map = new Map()
// set插入一个键值,返回该Map对象
map.set('one', 1)
// map的size属性获取Map对象中的键值对个数
console.log(map.size) // 1
// get获取 map 中的键对应的值
console.log(map.get('one')) // 1
// has 判断Map对象中是否存在该键对应的值
console.log(map.has('one')) // true
// 删除Map对象中键对应的键值对,删除成功则返回true,否则返回false
console.log(map.delete('one')) // true
// keys和values方法,返回键和值的Iterator对象
map.keys() // MapIterator {'one'}
map.values() // MapIterator {1}
Map的键可以是任意值
// key是字符串
let map = new Map()
const keyString = 'two'
map.set(keyString, 2)
// key是函数
let map = new Map()
const keyFunction = function () {}
map.set(keyFunction, 'keyFunction')
map.get(keyFunction) // 'keyFunction'
map.get(function () {}) // undefined
// key是对象
let map = new Map()
const keyObject = {}
map.set(keyObject, 'keyObject')
map.get(keyObject) // 'keyObject'
map.get({}) // undefined
// 当key为对象时,只有传入对象的引用才能获取到对应的值
对Map对象的迭代方法
let map = new Map()
map.set(1, 'one')
map.set(2, 'two')
for (const [key, value] of map) {
console.log(key + '--' + value)
}
// 1--one 2--two
map.forEach(function(key, value){
console.log(key + '---' + value)
})
// 1---one 2---two
Set对象 Set可以存任意类型的唯一值,不管是对象引用还是字符串 特殊情况:
- +0和-0在判断唯一性的时候是相等的,所以在Set中不会重复
- undefined和undefined是恒等的,所以不会重复
- NaN和NaN虽然是不恒等的,但是在Set中只能存在一个 Set的方法:
let mySet = new Set()
// 添加元素
mySet.add('one')
// 判断是否有该元素
mySet.has('one')
// 删除元素
mySet.delete('one')
Set的迭代 for..of方法迭代
let mySet = new Set()
mySet.add('one')
mySet.add('two')
mySet.add('three')
for (const value of mySet) {
console.log(value)
}
// one two three
Set可用于数组去重
let array = [1, 2, 2, 3, 4]
let mySet = new Set(array)
array = [...mySet]