# ES6的新特性

# Map、Set、WeakMap、WeakSet

# Set

类似于传统的数组,但是Set中的成员不允许重复

# Map

传统的对象的key只能是字符串,如果使用对象作为key值的话,js会优先使用toString的方法转成string来作为key值
Map的数据结构可以使用任意类型的数据作为key

# WeakMap

WeakMap只能使用对象作为key值,而被引用的key值是弱引用,因此该对象可能在任意时刻被回收掉。
WeakMap无法被遍历,没有Object.keys()Object.values()Object.entries()方法,只有getsethasdelete4个方法。

# WeakSet

类似于WeakMap, 内部成员只能是对象,对其中的对象也是弱引用,当没有其他对WeakSet中的对象的引用的话,这些对象会被回收掉,WeakSet同样无法被遍历

# Symbol

ES6中新增了一种数据类型,Symbol,不是构造函数,在使用时不需要new,用来表示一个独一无二的数据,对象的key可以是Symbol
Symbol也可以用来标识对象中的私有成员,因为Symbol的唯一性,外部访问时无法创建同一个Symbol数据,因此可以用来表示对象中的私有成员。正因如此,如果对象的key是一个Symbol类型的话,是无法遍历得到这个key值的,既无法使用Object.keys或者for of遍历,只能使用Object.getOwnPropertySymbols方法来获取Symbol类型的key值。

如果需要使用同一个Symbol类型的数据,我们可以使用Symbol.for方法,传入同一个字符串时,返回的Symbol类型的数据也会是一样的,

const s1 = Symbol.for('symbol')
const s2 = Symbol.for('symbol')

console.log(s1 === s2)   // true

需要注意的是该方法如果传入的值不是字符串的话,Symbol内部会先将其传值字符串,因此传入一个true和字符串'true',返回的Symbol数据也会是同一个

# Reflect

Reflect是ES6中引入的对象操作方法,一个静态类,不能使用new Reflect()来进行调用,类似于Math,内置的静态方法与proxy的方法相同。
个人感觉 Reflect的引入是对ES5中操作对象方法的规范处理

比如,在ES5中需要获取对象中的某一个属性,或者删除对象中某一个属性,我们都会使用到'name' in obj, delete obj['name'],既使用到delete操作符又用到了in运算符,看起来很不规范,但是在Reflect中我们就可以统一使用Reflect的内置方法,Reflect.has(obj, 'name')Reflect.deleteProperty(obj, 'name'),这样看起来就比较统一规范。如下:

var obj = {
  name: 'Tom'
  age: 100
}

// ES5方法
'name' in obj
delete obj.name
Object.keys(obj)

// Reflect
Reflect.has(obj, 'name')
Reflect.deleteProperty(obj, 'name')
Reflect.ownKeys(obj)

# Reflect的静态方法

  1. Reflect.get() 获取对象中的某一个属性,类似于执行obj['name']
  2. Reflect.set 给对象设置属性和值
  3. Reflect.has() 判断对象中是否存在某一个属性,类似于in运算符
  4. Reflect.ownKeys() 获取对象中所有的属性值,返回一个数组,类似于Object.keys()
  5. Reflect.deleteProperty() 删除对象中的某一个属性,类似于delete操作符
  6. Reflect.apply() 对一个函数的调用,类似于Function.prototype.apply()
  7. Reflect.construct() 创建一个构造函数,类似于new操作符
  8. Reflect.defineProperty() 设置一个响应式对象,类似于Object.defineProperty()
  9. Reflect.getOwnPropertyDescriptor() 获取对象中的某一个属性的描述,类似于Object.getOwnPropertyDescriptor()
  10. Reflect.getPropertyOf() 获取指定对象的原型,类似于Object.getPropertyOf()
  11. Reflect.setPropertyOf() 给对象设置原型
  12. Reflect.preventExtensions() 设置一个对象无法添加新的属性,类似与Object.preventExtensions()
  13. Reflect.isExtensible() 判断对象是否可以添加新的属性,类似与Object.isExtensible()
Last Updated: 5/8/2021, 6:26:32 PM