set、map、WeakSet和WeakMap的区别

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

你可能感兴趣的:(javascript,es6,前端)