# 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()方法,只有get、set、has、delete4个方法。
# 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的静态方法
Reflect.get()获取对象中的某一个属性,类似于执行obj['name']Reflect.set给对象设置属性和值Reflect.has()判断对象中是否存在某一个属性,类似于in运算符Reflect.ownKeys()获取对象中所有的属性值,返回一个数组,类似于Object.keys()Reflect.deleteProperty()删除对象中的某一个属性,类似于delete操作符Reflect.apply()对一个函数的调用,类似于Function.prototype.apply()Reflect.construct()创建一个构造函数,类似于new操作符Reflect.defineProperty()设置一个响应式对象,类似于Object.defineProperty()Reflect.getOwnPropertyDescriptor()获取对象中的某一个属性的描述,类似于Object.getOwnPropertyDescriptor()Reflect.getPropertyOf()获取指定对象的原型,类似于Object.getPropertyOf()Reflect.setPropertyOf()给对象设置原型Reflect.preventExtensions()设置一个对象无法添加新的属性,类似与Object.preventExtensions()Reflect.isExtensible()判断对象是否可以添加新的属性,类似与Object.isExtensible()