Map和Set的区别

215 阅读4分钟

Set

1、Set简述

Set本身提供构造函数(需要使用new创建Set数据结构)用来存储唯一值

const set = new Set()

同时可以接受一个数组作为参数创建Set

let array = [1,2,5,6]
const set = new Set(array)
console.log(set)
//结果:Set(4) {1, 2, 5, 6}

2、实例对象API

add(value):向Set中添加一条数据,比在数组中通过unshift(),push()要快,返回Set数据结构
has(value):判断Set中是否包含某一个元素,返回Boolean,牵扯到时间复杂度,比在数组中通过indexOf以及includes查找要快

set.has(value) //O(1)
array.indexOf(value) //O(n)
array.includes(value) //O(n)

delete(value):通过值从Set中删除一个元素,并且不需要下表索引。相当于数组中基于下表索引的splice()方法 方法返回Boolean类型,表明是否删除成功
clear():清除Set中的值,不需要任何参数

3、Set遍历方法

方法/属性功能介绍
keys()返回Set对象键名的遍历器
values()返回Set对象键值的遍历器
entries()返回Set对象键值对的遍历器

image.png

4、WeakSet

关于这个我没有用过,只是大概了解过
WeakSet类似于Set,值不允许重复,但是成员只能是弱引用的对象,弱引用对象会被垃圾回收机制回收掉, 可以用来保存DOM节点? 包含和Set同样的除clear()除外的另外三个方法,无法进行遍历,没有size

最后总结

Set类似数组,值不允许重复  
可以存储任何类型值  
不支持自动转换,5'5'是不一样的  
可以存储nullundefined  
有可能两个null都不一样  

Map

1、Map简述

Map对象保存键值对
Map本身是一个构造函数(需要new创建),用来生成Map数据结构
Map对象允许你储存任何类型的作为一个键或一个值

map可以通过new初始化

const map = new Map()

同时也可以通过向Map中传入数组完成初始化

const map = new Map([['name','Alliances'],['city','YC']])
console.log(map)
VM540:2 Map(2) {'name' => 'Alliances', 'city' => 'YC'}

另外也可以通过把对象当做键传入值

let obj = {
    'desc':'懒懒散散的程序员'
}
map.set(obj,'他说的对')
console.log(map)
//Map(3) {'name' => 'Alliances', 'city' => 'YC', {…} => '他说的对'}
console.log(map.get(obj))
//他说的对

2、实例对象API

set(key,value): 向Map中插入键值对,返回整个Map

console.log(map.set('age','18'))
//Map(4) {'name' => 'Alliances', 'city' => 'YC', {…} => '他说的对', 'age' => '18'}

get(key): 返回数据,通过键得到值

console.log(map.get(obj)) //他说的对

has(key):查找key对应的值是否存在,返回Boolean表明是否存在

console.log(map.get('gender'))
//undefined

delete(key): 通过key删除键值对,返回Boolean用来判断是否成功

console.log(map.delete('ciy'))
//false
console.log(map.delete('city'))
//true

clear():清空Map,没有参数,没有返回值

3、遍历

keys() 返回一个包含Map中所有键的遍历器对象

for(let j of map.keys()){
    console.log(j)
}
//name
//{desc: '懒懒散散的程序员'}
//age

values() 返回一个包含Map中所有值得遍历器对象

for(let k of map.values()){
    console.log(k)
}
//Alliances
//他说的对
//18

entries() 返回一个包含Map中所有键值对的遍历器对象

for(let e of map.entries()){
    console.log(e)
}
//['name', 'Alliances']
//[{…}, '他说的对']
//['age', '18']

forEach

map.forEach((value,key,map)=>{
    console.log(key,value,map)
})
//name Alliances Map(3) {'name' => 'Alliances', {…} => '他说的对', 'age' => '18'}
//{desc: '懒懒散散的程序员'} '他说的对' Map(3) {'name' => 'Alliances', {…} => '他说的对', 'age' => '18'}
//age 18 Map(3) {'name' => 'Alliances', {…} => '他说的对', 'age' => '18'}

4、总结

支持所有数据类型做为键 本质上是键值对的集合 NaN和undefined都可以被存

Map和Set的区别

1、Map采用键值对(key,value)来存储元素,而Set采用和数组类似的方式存储数组,这是两者本质上的区别
2、Set不允许重复的值,而Map依靠于(key,value)形式,所以不允许重复的key,value可以重复 3、Map键值分离,值不作为键
...想到再更新...

Map和Object的区别

1、Map继承于Object
2、Object的属性的key只能是简单数据类型(字符串,整数,Symbol),而Map的key可以是任何类型
3、Map在存储大量元素的时候性能要比Object好,写入删除操作频繁情况下应该使用Map
4、Map插入元素有FIFO(First In, First Out),Object不存在