• ES6 Symbol数据类型和set-map 数据结构


    Symbol数据类型

    ES6新加的数据类型,提供一个独一无二的值

     { let a1 = Symbol() ;let a2 = Symbol() }  //声明
     { let a3 = Symbol.for('a3') }  //这种声明方式方便再取回来
     { let a1=Symbol.for('abc'); let obj={ [a1]:'123' , 'abc':235}; console.log(obj) }  //{abc: "235", Symbol(abc): "123"}

    如果使用Symbol配置值的话则使用let of 的方式取不到Symbol(abc)的值

     Object.getOwnPropertySymbols(obj).forEach(function(item){console.log(obj[item])});  //123 只取到Symbol的值

    取所有值://Reflect.ownKeys返回一个数组,包含对象自身的所有属性,不管是属性名是Symbol或字符串,也不管是否可枚举

    Reflect.ownKeys(obj).forEach(function(item){console.log(obj[item])})  //235  123

    set-map 数据结构

    set

    ① 声明

    不加参数 :

    { let list = new Set(); list.add(5) ; list.add(7); }  //list.size()是2

    加参数 :

    { let arr= [1,2,3,4,5]; let list = new Set(arr) }  //list.size()是5

    ② set添加重复的元素不会报错,但是不会添加进去,可以利用这个作用来去重(需要注意下元素的数据类型是否一致)

    { let list = new Set(); list.add(5) ; list.add(7); list.add(5); }  //list.size()是2

    ③ 操作函数 :

    add  delete  clear  has

    ④ 遍历:

    元素的keys()和values()的值是一样的

    for(let key of list.keys()){ console.log(key) }
    for(let value of list.values()){ console.log(value) }
    for(let [key,value] of list.entries()){ console.log(key,value) }

    WeakSet

    区别:

    支持的元素类型不一样,WeakSet只能是对象

    WeakSet的对象是弱引用,不会检测该对象是否在其他地方用过,只是地址的引用;

    没有size属性;没有clear方法;其余的add delete has 方法一致

    不能遍历

    ①声明

    { let weakset = new WeakSet() ; let arg ={} ; weakset.add(args) }

    Map 键值对

    key可以是任何数据类型

    ①声明 :

    { let map = new Map(); let arr= ['123']; map.set(arr,'234'); }  //map.get(arr) = '234'
    
    { let map = new Map([ ['a',123],['b',456] ])}  //{"a"=>123,"b"=>456} ; map.size=2

    map不能set一个item对象,需要使用声明的第二种方式

    ②函数:set  delete  clear

    ③遍历:同set

    WeakMap

    接收的key值必须是对象,没有clear方法,不能遍历

    { let weakmap = new WeakMap() ; let obj={}; weakmap.set(obj,123)}  //weakmap.get(obj)=123

    对比:

    Set Map与Array对比

    let set= new Set() ; let map = new Map() ; let arr = [] ;

    //增加

    set.add({t:1});
    map.set('t',1);  
    arr.push({t:1}) 

    //查找

    let set_exists = list.has({t:1})  ///false ,has查询的是对象的引用
    let map_exists = map.has(‘t’)  //true 返回布尔值
    let arr_exists = array.find(item=>item.t)  //{t:1} 返回对象

    //改

    set.forEach(item=>item.t?item.t=2:'')  //在set中要是直接修改的话他不会检查是否冲突,而是直接加了一个,所以需要先找到再修改
    map.set('t',2);
    array.forEach(item=>item.t?item.t=2:'')  //数组需要先forEach找到再修改

    //删除

    set.forEach(item = item.t?set.delete(item):'')
    map.delete('t')
    let index = array.findIndex(item=>item.t)  array.splice(index,1) //数组需要先找到再删

    Map Set 和Array的对比

    let item = {t:1}; let set= new Set(); let map = new Map(); let obj={}

    //增加

    set.add(item)
    map.set('t',1)
    obj['t']:1

    //查询

    set.has(item)  //
    map.has('t')
    't' in obj  //使用in

    //删除

    set.delete(item)
    map.delete('t')
    delete obj['t']

    //修改

    item.t =2 //set是引用,直接修改item,set下的值会随之变化
    map.set('t':4)
    obj['t']=4

    使用场景:

    能使用map的不使用数组,对于数据要求比较高和唯一性使用set,放弃object

     

  • 相关阅读:
    程序员数学
    [topcoder]FlowerGarden
    [leetcode]Trapping Rain Water
    [leetcode]Gray Code
    [leetcode]Unique Paths II
    hdu 4112 Break the Chocolate(ceil floor)
    【转】博弈-翻硬币游戏
    POJ 3710 Christmas Game
    hdu 3590 PP and QQ
    博弈进阶
  • 原文地址:https://www.cnblogs.com/lskzj/p/9543535.html
Copyright © 2020-2023  润新知