Map,WeakMap,Set,WeakSet,Symbol

286 阅读1分钟

一、Map和WeakMap

Map可以接受各种类型的值当作键,对同一个对象的引用才视为同一个键,否则取不到。

属性:get,set,has,delete,clear

遍历:keys,valuse,forEach,entries(遍历顺序就是插入顺序)

WeakMap 只接受对象作为键值,null除外,键名所引用的对象都是弱引用,不会计入垃圾回收机制,一旦不需要会自动删除。

属性:get,set,has,delete

二、Set和WeakSet

Set 成员惟一,不会有重复的值,判断和===差不多效果,区别在于NaN是等于自身的,===是不相等的

属性:size,adddelete,has,clear

遍历:keys,values,entries,forEach(keys 和values 一致)

Array.from方法可以将Set转化为array

WeakSet 只能放对象,对象的弱引用,如果在其他地方无引用则垃圾回收

属性:add,delete,has

不能遍历

三、Symbol.iterat

object用for...of需要加Symbol.itera需要加

let obj = {

      0: 'a',

      1: 'b',

      2: 'c',

      length: 3,

      [Symbol.iterator]: function () {

          // index用来记遍历圈数

          let index = 0;

          let next = () => {

              return {

                  value: this[index],

                  done: this.length == ++index

              }

          }

          return {

              next

          }

      }

  }

四、Symbol基础数据类型

let s = Symbol('any')

每个Symbol都是惟一,可以用来做键值。

但是针对obj的for in,object.keys不能遍历到以Symbol做键值的属性。可以避免对外操作

JSON.stringify也会忽略

可以使用Object.getOwnPropertySymbol(obj)=> ['Symbol('name')]

Reflect.ownKeys(obj) 可以遍历到Symbol

可以私有化属性,只有在当前模块才能访问,因为Symbol惟一

Symbol.for('name') 可以创建多个window下的唯一Symbol