Map
Map对象保存键值对,任何值(对象或者原始值)都可以作为一个键或一个值。
Map与Object的区别:
- 一个Object的键只能是字符串或者Symbols,但一个Map的键可以是任意的值。
- Map中的键值是有顺序的(FIFO),而添加到对象中的键则不是。
- Map的键值对的个数可以从size中获取,而Object中的键值个数只能手动计算。
- Object有自己的原型。原型链上的键名有可能和自己在对象上设置的键名产生冲突。
var map = new Map()
map.set('key', 'value')
console.log(map.get('key'))
//键值为对象
var map = new Map()
map.set('key', 'value')
console.log(map.get('key'))
//函数作为键值
var map = new Map()
var func = function () {}
map.set(func, 'function value')
console.log(map.get(func))
//NaN作为键值
var map = new Map()
map.set(NaN, 'not a number')
console.log(map.get(NaN))
var foo = Number('foo')
console.log(map.get(foo))
Map的迭代
var map = new Map()
map.set(0, 'zero')
map.set(1, 'one')
for(var [key, value] of map){
console.log(key + " = " + value)
}
在以下方法中entries返回一个新的Iterator对象,它按插入顺序包含了Map对象中的每个元素的[key, value]数组。
for(var [key, value] of map.entries()){
console.log(key + " = " + value)
}
以下方法的keys方法也是返回一个Iterator对象。它按照插入的顺序包含了Map对象中的每个元素的键值。
for(var key of map.keys()){
console.log(key)
}
以下的values方法也是返回一个Iterator对象。它按照插入顺序包含了Map对象中每个元素的值。
for(var value of map.values()){
console.log(value)
}
forEach方法
map.forEach(function (key, value) {
console.log(key + ' = ' + value)
}, map)
Map对象的操作
Map与Array的转换
var arr = [[0, 'zero'], [1, 'one']]
var myMap = new Map(arr)
var outArray = Array.from(myMap)
Map的合并
var map1 = new Map([[0, 'zero'], [1, 'one']])
var map2 = new Map([[2, 'two'], [3, 'three'], [4, 'four']])
var merge = new Map([...map1, ...map2])
Set对象
Set对象允许存储任何类型唯一的值,无论是原始值或者是对象引用。
Set中特殊的值
Set对象存储的值总是唯一的所以需要判断两个值是否恒等。有几种特殊的情况需要特殊对待:
- +0和-0在存储判断唯一性的时候是恒等的,所以不存在重复。
- undefined和undefined是恒等的,所以不存在重复。
- NaN和NaN是不恒等的,但是在Set中只能存在一个,不重复。
let set = new Set()
set.add(1)
set.add(2)
set.add(3)
console.log(set)
类型转换
Array转Set
var mySet = new Set([1, 2, 3])
Set转Array
var myArray = [...mySet]
String转Set
var strSet = new Set('hello')
Set对象的操作
交集
let set1 = new Set([1, 2, 3])
let set2 = new Set([2, 3, 5])
var insection = new Set([...set1].filter( x => set2.has(x)))
差集
let set1 = new Set([1, 2, 3])
let set2 = new Set([2, 3, 5])
var insection = new Set([...set1].filter( x => !set2.has(x)))