# symbol

ES6新增原始数据类型Symbol,表示独一无二的值。它js语言的第七种数据类型,前六种是:undefined、null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。

//生成方式
let s1 = Symbol('foo');
//Symbol 值作为对象属性名时,不能用点运算符。[]
let mySymbol = Symbol();
let a = {};
a[mySymbol] = 'Hello!';//个人感觉symbol比较鸡肋

# Set & Map

  1. Set
    类似于数组,但是成员的值都是唯一的

    const set = new Set([1, 2, 3, 4, 4]);
    [...set]//可以用...展开
    // 去除数组的重复成员
    [...new Set(array)]
    

    方法有

    • size() 成员总数
    • add(v) 添加值,返回本身
    • delete(v) 删除值,返回布尔
    • has(v) 是否有某值,返回布尔
    • clear() 清除所有值
      可以用Array.from转为数组
  2. WeakSet 和set类似,区别:

  • WeakSet 的成员只能是对象,而不能是其他类型的值。
  • 其对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在WeakSe 之中,不计入垃圾回收机制
    WeakSet 不可遍历,没有size()
  1. Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键
    const map = new Map([
    ['name', '张三'],
    ['title', 'Author']
    ]);
    
    map.size // 2
    map.set('age',34)//返回本身
    map.has('name') // true
    map.get('name') // "张三"
    map.delete('title')
    map.clear()//清空
    
  2. WeakMap WeakMap结构与Map,区别:
  • 只接受对象作为键名(null除外),不接受其他类型的值作为键名
  • WeakMap的键名所指向的对象,不计入垃圾回收机制,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用。