对象的扩展
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,就不再运算。

浙公网安备 33010602011771号