一、array,object,map,set基本数据操作比较
    set和map都能有快捷的增删清空查的方法,set不能直接修改元素,map有个设置元素的方法set。
    map和set有自身的基本操作,也可以转化为数组使用各种类型的数组方法。

    1. let obj = {name:'obj'},
    2. arr = ['name'],
    3. map = new Map([['name': 'map']]),
    4. set = new Set(['name']);
    5. //新增数据
    6. obj['height'] = 180;
    7. arr.push['height'];
    8. map.set('height', 180),
    9. set.add('height');
    10. //删除
    11. delete obj['height'];
    12. arr.split(arr.indexOf('height'),1)
    13. map.delete('height');
    14. set.delete('height');
    15. //改
    16. map = map.set('height', 185)
    17. set = map.set('height', 185)
    18. obj['height'] = 185
    19. arr[arr.indexOf('height')] = 185
    20. //查找,map和set只能查找是否包含元素得到boolean
    21. map.has('height')
    22. set.has('height')
    23. obj['height']
    24. arr.includes('height')

    二、proxy
    proxy是对js中某些操作的默认行为的修改,属于对编程语言的修改,是’元编程’(meta programming)。比如’object.name’中点运算符,本来是直接访问对象身上的属性,代理对象后,会触发get处理函数。
    proxy是对对象的一种拦截,对外界操作和访问的一种改写与过滤

    访问proxy实例,会有处理函数进行拦截。访问源对象,是正常访问。
    proxy参数:
    1、代理对象
    2、代理配置(各种操作的对应拦截处理)

    1. let obj = {
    2. name:'obj',
    3. age: 25,
    4. preference:'rock'
    5. };
    6. let objProxy = new Proxy(obj, {
    7. get(target, propKey, proxyInstance){
    8. console.log(target, proxyInstance, )
    9. return target[propKey]
    10. },
    11. set(target, propKey, val, proxyInstance){
    12. console.log(target, propKey, val, proxyInstance)
    13. obj[propKey] = 'modifiedProp'
    14. return true
    15. },
    16. has(target, propKey){
    17. console.log(target, propKey)
    18. return NaN
    19. }
    20. })
    21. obj.name = 'newObj'
    22. objProxy.preference = 'pop'
    23. console.log('lalal' in objProxy)

    set代理应该返回一个boolean值true,如果返回false或者undefined,在严格模式下会报错。
    has代理,拦截in操作,但是不会拦截 for in 操作(通过ownKeys代理来拦截)。
    ownKeys可以拦截获取属性名的方法,Object.keys,getOwnpropertyNames,getOwnPropertySymbols,for in。

    vue中,Object.defineProperty和Proxy的区别,使用Object.defineProperty需要遍历添加属性,而Proxy直接代理,而且处理函数中操作代理对象很方便。

    三、Reflect
    和proxy一样,也是es6为操作对象提供的新api。目的有以下几个.
    (1)将Object上明显属于语言层面上的方法(如Object.defineProperty),放在Reflect上,现阶段有些方法同时放在Object和Reflect上,未来新方法只部署在Reflect上。
    (2)让某些操作,如in、delete操作符变成编程函数方法。in = Reflect.has, delete = Reflect.deleteProperty
    (3)让Reflect的方法和proxy每个拦截方法一一对应。让proxy更好的修改相关操作的默认行为。
    (4)修改某些Object静态方法的返回值,变得更合理。如Object.defineProperty无法定义属性时,会抛出错误,Reflect.defineProperty会返回false。