Set和Map

  • Set 和 Map 是 ES6 新增的两个数据类型
  • 都是属于内置构造函数
  • 使用 new 的方式来实例化使用

Set

  • 使用方式就是和 new 连用

    const s = new Set()
    console.log(s)
      
    /*
    	Set(0) {}
            size: (...)
            __proto__: Set
            [[Entries]]: Array(0)
            length: 0
    */
    
  • 就是一个数据集合

  • 我们可以在 new 的时候直接向内部添加数据

    // 实例化的时候直接添加数据要以数组的形式添加
    const s = new Set([1, 2, 3, {}, function () {}, true, 'hwllo'])
    console.log(s)
      
    /*
    	Set(7) {1, 2, 3, {…}, ƒ, …}
            size: (...)
            __proto__: Set
            [[Entries]]: Array(7)
            0: 1
            1: 2
            2: 3
            3: Object
            4: function () {}
            5: true
            6: "hwllo"
            length: 7
    */
    
  • 看上去是一个类似数组的数据结构,但是不是,就是 Set 数据结构

常用方法和属性

  • size : 用来获取该数据结构中有多少数据的

    const s = new Set([1, 2, 3, {}, function () {}, true, 'hwllo'])
    console.log(s.size) // 7
    
    • 看上去是一个和数组数据类型差不多的数据结构,而且我们也看到了 length 属性
    • 但是不能使用,想要获取该数据类型中的成员数量,需要使用 size 属性
  • add : 用来向该数据类型中追加数据

    const s = new Set()
    s.add(0)
    s.add({})
    s.add(function () {})
    console.log(s.size) // 3
    
    • 这个方法就是向该数据类型中追加数据使用的
  • delete : 是删除该数据结构中的某一个数据

    const s = new Set()
    s.add(0)
    s.add({})
    s.add(function () {})
      
    s.delete(0)
      
    console.log(s.size) // 2
    
  • clear : 清空数据结构中的所有数据

    const s = new Set()
    s.add(0)
    s.add({})
    s.add(function () {})
      
    s.clear()
      
    console.log(s.size) // 0
    
  • has : 查询数据解构中有没有某一个数据

    const s = new Set()
    s.add(0)
    s.add({})
    s.add(function () {})
      
    console.log(s.has(0)) // true
    
  • forEach : 用来遍历 Set 数据结构的方法

    const s = new Set()
    s.add(0)
    s.add({})
    s.add(function () {})
      
    s.forEach(item => {
        console.log(item) // 0   {}   function () {}
    })
    
  • 方法介绍的差不多了,有一个问题出现了,那就是

  • 我们的方法要么是添加,要么是删除,要么是查询,没有获取

  • 因为要获取 Set 结构里面的数据需要借助一个 ... 展开运算符

  • 把他里面的东西都放到一个数组里面去,然后再获取

    const s = new Set([1, 2, 3, 4, 5, 6])
    const a = [...s]
    console.log(a) // (6) [1, 2, 3, 4, 5, 6]
      
    console.log(a[0]) // 1
    console.log([...s][0]) // 1
    
  • 又一个问题出现了,new 的时候需要以数组的形式传递

  • 然后获取的时候又要转成数组的形式获取

  • 那么我为什么不一开始就定义数组,要这个 Set 数据类型干什么

  • 这就不得不提到一个 Set 的特点

  • Set 不允许存储重复的数据

    const s = new Set([1, 2, 3])
      
    s.add(4)  // 此时 size 是 4
    s.add(1)  // 此时 size 是 4
    s.add(2)  // 此时 size 是 4
    s.add(3)  // 此时 size 是 4
    

Map

  • 也是要和 new 连用

  • 是一个数据集合,是一个很类似于 对象 的数据集合

    const m = new Map()
    console.log(m)
      
    /*
    	Map(0) {}
            size: (...)
            __proto__: Map
            [[Entries]]: Array(0)
            length: 0
    */
    
  • 我们的对象中不管存储什么,key 一定是一个字符串类型

  • 但是再 Map 里面,我们的 key 可以为任意数据类型

  • 我们也管 Map 叫做 (值 = 值 的数据类型)

    const m = new Map([[{}, {}], [function () {}, function () {}], [true, 1]])
    console.log(m)
      
    /*
    	Map(3) {
          {...} => {...}, ƒ => ƒ, true => 1
        }
            size: (...)
            __proto__: Map
            [[Entries]]: Array(3)
            0: {Object => Object}
                key: {}
                value: {}
            1: {function () {} => function () {}}
                key: ƒ ()
                value: ƒ ()
            2: {true => 1}
                key: true
                value: 1
            length: 3
    */
      
    

常用方法和属性

  • size : 用来获取该数据类型中数据的个数

    const m = new Map([[{}, {}], [function () {}, function () {}], [true, 1]])
    console.log(m.size) // 3
    
  • delete : 用来删除该数据集合中的某一个数据

    const m = new Map([[{}, {}], [function () {}, function () {}], [true, 1]])
    m.delete(true)
      
    console.log(m.size) // 2
    
  • set : 用来向该数据集合中添加数据使用

    const m = new Map()
    m.set({ name: 'Jack' }, { age: 18 })
    console.log(m.size) // 1
    
  • get : 用来获取该数据集合中的某一个数据

    const m = new Map()
      
    m.set({ name: 'Jack' }, { age: 18 })
    m.set(true, function () {})
    console.log(m.get(true)) // function () {}
    
  • clear : 清除数据集合中的所有数据

    const m = new Map()
      
    m.set({ name: 'Jack' }, { age: 18 })
    m.set(true, function () {})
      
    m.clear()
      
    console.log(m.size) // 0
    
  • has : 用来判断数据集合中是否存在某一个数据

    const m = new Map()
      
    m.set({ name: 'Jack' }, { age: 18 })
    m.set(true, function () {})
      
    console.log(m.has(true)) // true