JSES6特性之Set Map Reflect等 | 青训营笔记

95 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第10天

Symbol

ES6中引入了一个新的数据类型Symbol,表示独一无二的值,通过Symbol()函数生成。 Symbol()函数之前不能使用new命令。

Set

类似于一个数组,但是里面的成员都是不重复的,类似于python的集合。 使用Set()来构造一个Set,并且用add()加入新的成员,可以用来去除数组或者字符串重复的内容。

delete()可以去除某个值,并返回布尔值表示是否删除成功。

has()判断Set中是否含有某个成员。

clear():清空Set。

Set的遍历

  • keys()
  • values()
  • entries()
  • forEach()

Set的遍历顺序是插入顺序。

WeakSet

WeakSet的成员只能是对象,不能是其它类型的值。 WeakSet有add(),delete(),has()这三个方法。

Map

Map是一种更加完善的Hash结构,提供了“值-值”的对应。

Map的属性和操作方法

  • size()
  • set(key,value)
  • get(key)
  • has(key)
  • delete(key)
  • clear()

遍历:

  • keys()
  • values()
  • entries()
  • forEach()

WeakMap

WeakMap只接受对象作为键名,并且所指的对象不计入垃圾回收机制。

Proxy

proxy用于修改某些操作的默认行为,对目标对象之前假设一层拦截,因此可以对外界的访问进行过滤和改写。

var proxy = new Proxy(target, handler);

target代表要拦截的对象,handler代表拦截行为。 如果handler没有设置任何拦截,就直接通向元对象。

以下是proxy支持的拦截操作一览:

  • get(target, propKey, receiver) :拦截对象属性的读取,比如proxy.fooproxy['foo']
  • set(target, propKey, value, receiver) :拦截对象属性的设置,比如proxy.foo = vproxy['foo'] = v,返回一个布尔值。
  • has(target, propKey) :拦截propKey in proxy的操作,返回一个布尔值。
  • deleteProperty(target, propKey) :拦截delete proxy[propKey]的操作,返回一个布尔值。
  • ownKeys(target) :拦截Object.getOwnPropertyNames(proxy)Object.getOwnPropertySymbols(proxy)Object.keys(proxy)for...in循环,返回一个数组。该方法返回目标对象所有自身的属性的属性名,而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。
  • getOwnPropertyDescriptor(target, propKey) :拦截Object.getOwnPropertyDescriptor(proxy, propKey),返回属性的描述对象。
  • defineProperty(target, propKey, propDesc) :拦截Object.defineProperty(proxy, propKey, propDesc)Object.defineProperties(proxy, propDescs),返回一个布尔值。
  • preventExtensions(target) :拦截Object.preventExtensions(proxy),返回一个布尔值。
  • getPrototypeOf(target) :拦截Object.getPrototypeOf(proxy),返回一个对象。
  • isExtensible(target) :拦截Object.isExtensible(proxy),返回一个布尔值。
  • setPrototypeOf(target, proto) :拦截Object.setPrototypeOf(proxy, proto),返回一个布尔值。如果目标对象是函数,那么还有两种额外操作可以拦截。
  • apply(target, object, args) :拦截 Proxy 实例作为函数调用的操作,比如proxy(...args)proxy.call(object, ...args)proxy.apply(...)
  • construct(target, args) :拦截 Proxy 实例作为构造函数调用的操作,比如new proxy(...args)

Reflect

也是ES6中新添加的API。 它有以下几个作用:

  1. 能从Reflect对象上拿到语言内部的方法。
  2. 修改某些Object方法返回的结果,让其变得更加合理。
  3. 能将Object操作都变为函数行为。 4.Reflect对象的方法和Proxy对象的方法一一对应。

Reflect对象的静态方法

  • Reflect.apply(target, thisArg, args)
  • Reflect.construct(target, args)
  • Reflect.get(target, name, receiver)
  • Reflect.set(target, name, value, receiver)
  • Reflect.defineProperty(target, name, desc)
  • Reflect.deleteProperty(target, name)
  • Reflect.has(target, name)
  • Reflect.ownKeys(target)
  • Reflect.isExtensible(target)
  • Reflect.preventExtensions(target)
  • Reflect.getOwnPropertyDescriptor(target, name)
  • Reflect.getPrototypeOf(target)
  • Reflect.setPrototypeOf(target, prototype)