对象扩展

ES6

  • 属性简洁表示法
    就是当属性的key和value一样时,写一个就好了(Vue中的传值、组件注册就是这样使用的)。

  • 属性名表达式
    当属性的key值是变量时,用[]把变量名包起来。[key]:value。

  • Object.is()
    判断两个值是否严格相等(和===相似),可以用于NaN。

  • 扩展运算符与Object.assign()
    对象合并(保留原有的属性,一样的会覆盖,有点像数组的concat())

  • in
    判断对象里是否包含该属性(注意数组用in的时候是判断该下标是否有值,毕竟对数组来说使用下标来索引的,下标的数字就像属性一样)。
    不管是不是原型属性都会返回true,而hasOwnProperty只有是当前实例的属性时才返回true。

  • 对象的遍历方式
    Object.keys()、Object.getOwnPropertyNames()、Reflect.ownKeys

  • 代理Proxy
    Vue3中实现响应的原理。

    使用Proxy对象来代理值可以对读写进行限制。还有deleteProperty()、has()、ownKeys()等一系列钩子函数。ownKeys()是针对循环遍历的拦截,哪些要遍历哪些不能遍历。
    拦截操作:
    1、get(target,prop) 参数:代理目标,当前属性。抛错或返回值。读取时拦截。
    2、set(target,prop,value) 参数:代理目标,当前属性,属性对应的值。抛错或返回一个波尔值(修改完后返回个true),为true会修改代理目标的内容。设置值时拦截。
    3、has(target,prop) 参数:代理目标,当前属性。用in的时候拦截。
    4、deleteProperty(target,prop) 参数:代理目标,当前属性。抛错或返回一个波尔值(用delete删完后返回个true)。删除时拦截。
    5、ownKeys(target)使用filter()来过滤。遍历时拦截。

const ownK = new Proxy(obj,{
  ownKeys(target) { target就是当前代理的对象
   return Object.keys(target).filter(key => !key.startWith('_'))
  } 
})

6、apply(target,ctx,args) 参数:代理目标,上下文,目标参数的一个数组(类似arguments,使用rest参数…来处理) 改变函数的返回值。当函数被调用或被apply、call调用时就会触发。
7、construct(target,args,newTarget) 参数:代理目标,目标参数数组,目标的构造函数。要返回一个实例化对象(new target(…args))。使用new时拦截。

  • 反射Reflect
    对于Object中方法的合理化。
    1、将Object属于语言内部的方法放到Reflect上。(Object里的方法Reflect上都可以用)
    2、修改某些Object方法的返回结果,让其结果变得合理。(有些本来会报错的现在变成返回false了,这样就不用try catch了,直接判断即可)
    3、让Object操作变为函数行为。(一些命令式的写法变成函数式的写法。prop in Object 变成了Reflect.has(Object,prop))
    4、Reflect对象的方法与Proxy对象的方法一一对应。(就是更加简便的写法)

ES8

  • Object.values()、Object.entries()
    之前在遍历数组时使用过数组的values()和entries()方法。此处是一个静态方法,数组里是一个实例方法。
    之前还是用过Object.keys(),这三者是相似的。在括号里将目标当做参数即可,返回一个数组。

  • Object.getOwn

  • 对象属性描述
    Object.getOwnPropertyDescriptors(obj)
    会返回该对象下所有属性的描述

    Object.getOwnPropertyDescriptor(obj,prop)
    会返回该对象下这一个属性的描述

描述的属性:
1、value
2、writable
3、enumerable 能否通过for in 遍历
4、configurable 能否通过delete删除

怎么设置这几个值呢?

Reflect.defineProperty(obj,'prop',{
    value:,
    writable:,
    configurable:,
    enumerable:
})

ES9

  • Rest&Spread
    之前学过对数组的Rest(就是三个点…),这里其实是和数组一样的方法。
    数组中:
const arr1 = [1,2,3]
const arr2 = [4,5,6]
const arr3 = [...arr1,...arr2]

对象中(是一种深拷贝)

const obj1 = {
   a,
   b
}
const obj2 = {
   ...obj1
}
const obj3 = {
  c,
  d
}
const obj4 = {...obj1,...obj3}

结构赋值(这个时候Rest参数要放到最后)
前面的属性名要匹配,后面的rest无所谓,记得写最后就好。

const {a,b,...rest} = obj

ES10

  • Object.fromEntries()
    1、把一个Map的输出结构转化为对象结构(a=>'a’转变为a:‘a’)。
    2、有时候会把对象中的内容取出来,用entries()转化为一个键值对的数组,然后通过filter来过滤。
    再通过fromEntries()转化回属性的形式。
const res = Object.entries(course).filter(([key,val])=>val>80);
console.log(Object.fromEntries(res));

ES11

  • 全局对象——globalThis
    提供了一个标准方式去获取不同环境下的全局对象。

    举例:node里面的全局对象是global,web里的全局对象是window(self,窗口指window而self指窗口本身,其实就一样因为输出self得到的也是window)

console.log(globalThis)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值