• ES6学习笔记(一)--Set和Map


    关于Set

    Set是什么?

      Set是es6新的数据结构,类似数组,是一个构造函数。

    Set可以用来做什么?

      1.用来数组快速去重

    const a_list = [1,2,1,2,2,3,4,5]
    // 可接收数组参数
    const a_set = new Set()
    console.log(...a_set) // 1 2 3 4 5
    const b_list = Array.from(a_set)
    console.log(b_list) // 1 2 3 4 5
    // 可接收字符串参数 const b_str = 'abcdefgabcdefg' console.log(...new Set(b_str)) // a b c d e f g tips:向Set加入数值不发生类型转换 5跟 '5'一起加入是不会被去重的 NaN === NaN // false 但是Set认为是相等的

    2.实例的属性方法

      

    // 增 ---添加值,并返回整个Set实例
      a_set.add(2) 
    
    // 删  --- 删除Set实例成员值,并返回布尔值
       a_set.delete(2) // true
    
    // 查 ---  查找是Set实例否存在这个值,并返回布尔值
       a_set.has(2) // false
    
    // 清除全部 ---清除Set实例全部内容,不返回任何值
       a_set.clear()
    
    // 长度 --- 返回Set实例成员的总数
       a_set.size() 

    // 遍历 --- 遍历键keys、值values、键值对;由于Set数据结构没有键名,只有键值,所以keys/values 遍历的结果都一样
    for(let item of a_set.keys()){
    console.log(item) // 1 2 3 4 5 6
    }
       for(let item of a_set.values()){
    console.log(item) // 1 2 3 4 5 6
    }
       for(let item of a_set.entries()){
    console.log(item) // [1,1] [2,2] [3,3 [4,4] [5,5] [6,6]
    }

    tips:Set数据结构的实例默认就是values遍历 所以直接 for(let item of a_set){} 就可以
    也可以a_set.forEach(function(value, key, aSet){ console.log(key,value) })
    数组的map、filter方法也同样适用a_set
    
    

    3.Set数据结构跟Array数组互转

    // Set转数组
    const c_list = Array.from(a_set);
    
    //数组转Set
    const d_set = new Set(c_list)

    关于WeakSet

        跟Set类似,也是一个不重复值的集合,但与Set有三点不同

       1)只能存储对象

       2) 其成员的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用,

        一旦其他对象不引用该对象,那么垃圾回收机制就会自动回收该对象所占用的内存,不管该对象是否存在于WeakSet中

       3)只有add() / delete() / has() 方法,不能遍历

    关于Map

       es6之前,作为键值对集合的Object的键只能是字符串,即使是不是字符串也将被自动转为字符串

       es6的Map的出现解除了这种限制,作为键,可以是任意值

     const key = {a: 'a'}
     const value = [1,2,3,4]
     const a_map = new Map([)
     a_map.set(key, value)
     a_map.get(key) // [1,2,3,4]
    
     // 与Set一样有has()、delete()、clear()方法,size属性,且有set()、get()方法
     a_map.has(key) // true
     a_map.deltete(key) // true
     a_map.has(key) // false 
    
    // 可接受数组作为参数,且成员一定要是表示键值的双元素小数组
    const  b_list = [[1, 2], ['key', 'value']]
    const  b_map = new Map(b_list)
    b_map.get(1) // 2
    b_map.get('key') // 'value'
    
    const d_set  = new Set([1,2],['key', 'value'])
    const c_map = new Map(d_set)
    c_map.get('key') // 'value'
    const d_map = new Map(c_map)
    d_map.get('key') // 'value'
    
    // 如果对同一个键赋值多次,会产生覆盖效果
    d_map.set('key', 'value1')
    d_map.get('key') //  'value1'
    tips:当用对象作为键,要注意是否是同一个对象
           d_map.set({a:'b'},'obj')
           d_map.get({a:'b'}) // undefined
    NaN === NaN false NaN不严格相等于自身 但是Map视为同一个键
    // 跟Set一样可以进行遍历
       1) d_map.values() //  返回值 
       2) d_map.keys()   // 返回键
       3) d_map.entries() // 返回键值
       4) d_map.forEach() // 遍历所有成员
    // Map集合转为数组
    const d1_list = [...d_map.values()] // 所有值组成的数组
    const d2_list = [...d_map.keys()]   // 所有键组成的数组
    const d3_list = [...d_map.entries()] // 所有键值小数组组成的大数组
    const d4_list = [...d_map]   // 所有键值小数组组成的大数组

    关于WeakMap

       跟Map一样有set、get方法,跟WeakSet一样只接受对象作为键(null除外),

      也是弱引用,会被垃圾回收机制自动回收,也是不能遍历,没有size属性,

      注意这里的对象引用只是键的引用不是键值,

  • 相关阅读:
    【程序2】
    【程序1】
    基数排序
    归并排序
    选择排序
    leetcode15
    leetcode221
    leetcode322
    leetcode921
    leetcode922
  • 原文地址:https://www.cnblogs.com/zhangky/p/12209811.html
Copyright © 2020-2023  润新知