欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

set、map、WeakSet和WeakMap的区别

程序员文章站 2022-06-12 21:42:24
...

set(集合)
set和map主要用于 数据重组 和 数据存储,set是集合的数据结构,map是字典的数据结构;set是ES6新增的一种新的数据结构,类似于数组,但是成员唯一且无序,没有重复的值;set对象允许你存储任何类型的唯一值,无论是原始值或是对象的引用。且本身就是一种构造函数,用于生成set数据结构

var sett = new Set();  //Object
sett.add(2)
console.log(sett.length,'--',sett.size)  // undefined 1
// size为元素个数 
[1,2,3,4,5].forEach(i=>sett.add(i))
console.log(sett)  // [2,1,3,4,5]  输出只会有一个2

Set实例方法有:

  • 操作方法
    • add:新增,相当于数组操作的push
    • delete: 存在即删除
    • has:判断集合中是否存在
    • clear: 清空集合
  • 遍历方法
    • keys():返回一个包含集合中所有键的迭代器
    • value(): 返回一个包含集合中所有值的迭代器
    • entries():返回一个包含Set对象中所有元素的键值对迭代器
    • forEach(callbackFn,thisArg): 用于对集合成员callbackFn操作,若有thisArg,则回调中的this为它,没有返回值

WeakSet
可将若对象存储在一个集合中
与Set的区别主要在于:

  • WeakSet只能存储对象引用,不能存放值,而Set对象可以
  • WeakSet对象中存储的对象值都是被弱引用的,对象会被垃圾回收掉。WeakSet对象中元素取决于垃圾回收机制有没有运行,运行前后可能会不一致。WeakSet对象无法被遍历,不能拿到它包含的所有元素
  • WeakSet的实例方法主要有:
    add(value):在对象中添加一个元素value
    has(value):判断WeakSet对象中是否包含value
    delete(value):删除元素value

Map(字典)
map 对象保存键值对,任何值都可以作为一个键或一个值
集合与字典的区别:
共同点:集合、字典 可以存储不重复的值
不同点:集合是以[value,value]的形式存储元素;字典是以[key,value]的形式存储
map的实例方法:

  1. 操作方法:
    set(key,value):向字典中添加元素
    get(key):通过键查找特定你的数值并返回
    has(key):判断字典中是否存在减key
    delete(key):通过键key删除字典对应的数据
    clear():删除字典中所有元素
  2. 遍历方法
    Keys():将字典中包含的所有键名一迭代器形式返回
    values():将字典中包含的所有数值以迭代器形式返回
    entries():返回所有成员的迭代器
    forEach():遍历字典的所有成员
  3. map与其他数据结构的相互转换
// 1.  Map 转 Array
    const map = new Map([
        [1, 1],
        [2, 2],
        [3, 3]
    ])
    console.log([...map]) // [[1, 1], [2, 2], [3, 3]]

    //2.  Array 转 Map
    const map = new Map([
        [1, 1],
        [2, 2],
        [3, 3]
    ])
    console.log(map) // Map {1 => 1, 2 => 2, 3 => 3}

    //3.  Map 转 Object
    function mapToObj(map) {
        let obj = Object.create(null)
        for (let [key, value] of map) {
            obj[key] = value
        }
        return obj
    }
    const map = new Map().set('name', 'An').set('des', 'JS')
    mapToObj(map) // {name: "An", des: "JS"}

    //4.  Object 转 Map
    function objToMap(obj) {
        let map = new Map()
        for (let key of Object.keys(obj)) {
            map.set(key, obj[key])
        }
        return map
    }
    objToMap({
        'name': 'An',
        'des': 'JS'
    }) // Map {"name" => "An", "des" => "JS"}

    //5.  Map 转 JSON
    function mapToJson(map) {
        return JSON.stringify([...map])
    }
    let map = new Map().set('name', 'An').set('des', 'JS')
    mapToJson(map) // [["name","An"],["des","JS"]]

    //6.  JSON 转 Map
    function jsonToStrMap(jsonStr) {
        return objToMap(JSON.parse(jsonStr));
    }
    jsonToStrMap('{"name": "An", "des": "JS"}') // Map {"name" => "An", "des" => "JS"}

WeakMap
WeakMap 对象是一组键值对的集合,其中键是弱引用对象,值是可以任意。WeakMap弱引用的只是键名,键值依然是正常引用。
实例方法有:

  • has(key):判断是否有key关联对象
  • get(key):返回key关联对象,没有则返回undefined
  • set(key):设置一组可以关联对象
  • delete(key):移除key的关联对象

总结:

  • set
    成员唯一、无序且不重复
    [value,value],键值与键名是一致的(或者说只有键值,没有键名)
    可以遍历
    方法有:add、delete、has、clear
  • WeakSet
    成员都是对象
    成员都是弱引用,可以被垃圾回收机制回收,可以用来保存DOM节点,不容易造成内存泄漏
    不能遍历
    方法有:add、delete、has
  • Map
    本质上是键值对的集合,类似集合
    可以遍历
    方法主要有:操作方法set、get、has、delete、clear;遍历方法:Keys、values、entries、forEach
    可以跟各种数据类型格式转换
  • WeakMap
    只接受对象作为键名(null)除外,不接受其他类型的值作为键名
    键名是弱引用,键值可以是任意的,键名所指向的对象可以被垃圾回收机制回收,此时键名是无效的
    不能遍历
    方法有:get、set、has、delete