0
点赞
收藏
分享

微信扫一扫

JS 基础:Map、Set、Weakmap

简述:

  • Set 和 Map 主要的应用场景在于 数据重组 和 数据储存。
  • Set 是一种叫做集合的数据结构,Map 是一种叫做字典的数据结构。

集合 与 字典 的区别:

  • 共同点:集合、字典 可以储存不重复的值
  • 不同点:集合 是以 [value, value]的形式储存元素,字典 是以 [key, value] 的形式储存

map与set的区别?

map

Map的key相比较普通对象来说更为灵活,普通对象的key只能以基础数据类型作为key值,并且所有传入的key值都会被转化成string类型,而Map的key可以是各种数据类型格式。

const map = new Map()
map.set({name:'xiaoli',age:10},'info')
map.has({name:'xiaoli',age:10}) // true

操作

操作方法:

  • set(key, value):向字典中添加新元素。
  • get(key):通过键查找特定的数值并返回。
  • has(key):判断字典中是否存在键key。
  • delete(key):通过键 key 从字典中移除对应的数据。
  • clear():将这个字典中的所有元素删除。

通常将 map 转成数组以便于利用数组的方法(比如,filter,every等)进行操作,如下例子过滤map中vlaue小于18的键值。

let map = new Map([['Tom',22],['Jerry',20],['Ela',16]]);

map = new Map([...map].filter(item=>{
    return item[1] > 18
}));
console.log(map)

输出结果为:

[...map] 操作将 map转为二维数组,key 是 item[0] , value是item[1],打印[...map], 结果如图:

遍历

遍历方法:

  • Keys():将字典中包含的所有键名以迭代器形式返回。
  • values():将字典中包含的所有数值以迭代器形式返回。
  • entries():返回所有成员的迭代器。
  • forEach():遍历字典的所有成员。
    let map = new Map([['Tom',22],['Jerry',20]]);
    for (const key of map.keys()) {
        console.log(key);//Tom Jerry
    }
    for (const value of map.values()) {
        console.log(value);//22 20
    }
    for (const item of map) {
        console.log(item);//["Tom", 22] ["Jerry", 20]
    }
    for (const item of map.entries()) {
        console.log(item);//["Tom", 22] ["Jerry", 20]
    }
    map.forEach(item=>{
        console.log(item)
    })

set

set 的特点:

  • Set可以讲讲它去重的特性。Set对象类似数组,且成员都是唯一的。
  • 向 Set 加入值的时候,不会发生类型转换,所以5和"5"是两个不同的值。
  • Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===)主要的区别是 NaN等于自身,而精确相等运算符认为NaN不等于自身。
let set = new Set();
let a = NaN;
let b = NaN;
set.add(a);
set.add(b);
set // Set {NaN}

let set1 = new Set()
set1.add(5)
set1.add('5')
console.log([...set1])	// [5, "5"]

使用Set成员唯一的特性进行,数组去重:

const arr = [1,2,3,4,4,5]
const set2 = new Set(arr)
console.log(set) // Set(5) {1, 2, 3, 4, 5}
const unqiueArr = [...set] //[1, 2, 3, 4, 5]

操作

  • add(value):新增,相当于 array里的push。
  • delete(value):存在即删除集合中value。
  • has(value):判断集合中是否存在 value。
  • clear():清空集合。

遍历

  • keys():返回一个包含集合中所有键的迭代器。
  • values():返回一个包含集合中所有值得迭代器。
  • entries():返回一个包含Set对象中所有元素得键值对迭代器。
  • forEach(callbackFn, thisArg):用于对集合成员执行callbackFn操作,如果提供了 thisArg 参数,回调中的this会是这个参数,没有返回值。

WeakMap 的特点

WeakMap只能以复杂数据类型作为key,并且key值是弱引用,对于垃圾回收更加友好。

  • 键名必须是对象
  • WeaMap对键名是弱引用的,键值是正常引用
  • 垃圾回收不考虑WeaMap的键名,不会改变引用计数器,键在其他地方不被引用时即删除
  • 因为WeakMap 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
  • 也是因为弱引用,WeaMap 结构没有keys( ),values( ),entries( )等方法和 size 属性
  • 当键的外部引用删除时,希望自动删除数据时使用 WeakMap

操作:

  • add(value):在WeakSet 对象中添加一个元素value。
  • has(value):判断 WeakSet 对象中是否包含value。
  • delete(value):删除元素 value。
举报

相关推荐

0 条评论