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)