对象的扩展

1. 对象的简洁表示法

允许直接写入对象和函数作为对象的属性和方法。(允许只写属性名,不写属性值,这时属性值等于属性名所代表的变量。方法省略:function)

2. 属性名表达式

表达式放在方括号内。(注意属性名表达式和简洁表示法不能同时使用,会报错;属性名表达式如果是一个对象,会自动将对象转为字符串[object Object])

3. 方法的name属性

注意:bind方法创造的函数添加bound前缀,Function构造函数返回anonymous。如果对象的方法是一个Symbol的值,那么返回Symbol值的描述。

4. Object.is(a,b)

比较严格相等,基本与===一致。
区别是:+0不等于-0;NaN等于自身。

5. Object.assign(目标对象,源对象)

用于将源对象的所有可枚举属性复制到目标对象。(不复制继承属性和不可枚举的属性。浅拷贝。属性名为Symbol值的属性也会被复制。
若有同名属性,后面的会覆盖前面的属性。
若参数不是对象,会先转为对象,由于undefined和Null无法转为对象,则会报错(为首参数时),不为首参数时不会报错,会跳过。
其他类型的值(数值、字符串、布尔值)不在首参数也不会报错,字符串会以数组形式复制到目标对象,其他不会产生效果。
用途:

  • 为对象添加属性和方法。
  • 克隆对象。(不克隆继承的值)
  • 合并多个对象。
  • 为属性指定默认值。

6. 属性的可枚举性(enumerable)

每一个属性都有一个descriptor描述对象,控制属性的行为。
ES6规定,所有class的原型的方法都是不可枚举的。

7. 属性的遍历

  • for...in
    遍历对象自身和继承的可枚举属性(不含symbol属性)
  • Object.keys(obj)
    返回一个数组包括对象自身的 所有可枚举属性。
  • Object.getOwnPropertyNames(obj)
    返回一个数组,包含对象自身的所有属性,包括不可枚举的(不含symbol和继承的)
  • Object.getOwnPropertySymbols(obj)
    返回一个数组,包含对象自身的所有symbol属性
  • Reflect.ownKeys(obj)
    返回一个数组,包含对象自身的所有属性,包括symbol和不可枚举的
    JSON.stringify():只串行化自身的可枚举属性

8. __proto__属性、Object.getPrototypeOf()、Object.setPrototypeOf()

用于设置和读取一个对象的prototype对象。
用法:Object.setPrototypeOf(obj,proto)将proto对象设置为obj对象的原型。
第一个参数不是对象会自动转为对象,undefined和Null会报错

9. Object.keys()、Object.values()、Object.entries()

不包含继承的属性。Object.values()、Object.entries()不包含symbol,会被忽略

//参数不是对象会先转为对象.由于数值和布尔值的包装对象都不会为实例添加非继承的属性,所以会返回空数组.
Object.values('abc');//['a','b','c']
Object.values(123);//[]
Object.values(true);//[]

10. 对象的扩展运算符

解构赋值不会复制继承自原型对象的属性

11. Object.getOwnPropertyDescriptors(对象,属性)

返回某个对象属性的描述对象。

12. Null传导远算符?.

message?.body?.user?.firstName只要其中一个返回null或undefined,就不再运算。

posted @ 2020-10-03 16:26  小耳朵兔  阅读(108)  评论(0)    收藏  举报