本篇博客记录了Object对象的新增方法。
Object.is()
ES5比较两个值是否相等,有两个运算符。==会自动转换数据类型,===的NaN不等于自身以及+0等于-0。Object.is与严格比较运算符的行为基本一致。不同之处只有两个:
- +0不等于-0
- NaN等于自身
1 | // ES5部署Object.is |
Object.assign()
Object.assign(target, source1, source2)将源对象的所有可枚举属性复制到目标对象(浅拷贝)。数值、布尔值、字符串会转成对应的包装对象,原始值会在包装对象的内部属性[[PrimitiveValue]]上面,只有字符串会产生可枚举的实义属性。null和undefined无法转成对象,不能用作首参数。
1 | Object(true) // {[[PrimitiveValue]]: true} |
1 | // 如果要复制的是一个取值函数,则将求值后再复制 |
用途
- 为对象添加属性
1
2
3
4
5class Point {
constructor(x, y) {
Object.assign(this, {x, y});
}
} - 为对象添加方法
1
2
3
4
5
6
7Object.assign(SomeClass.prototype, {
someMethod(arg1) {},
anotherMethod() {}
})
// 等同于
SomeClass.prototype.someMethod = function (arg1) {}
SomeClass.prototype.anotherMethod = function () {} - 克隆对象
1
2
3var newObj = Object.assign({}, obj)
var newObj = Object.assign(Object.create(Object.getPrototypeOf(obj)), obj) - 合并多个对象
1
const merge = (target, ...sources) => Object.assign(target, ...sources)
- 为属性指定默认值
1
Object.assign({}, DEFAULTS, options)
Object.getOwnPropertyDescriptors()
返回指定对象所有自身属性的描述对象
1 | function getOwnPropertyDescriptors(obj) { |
引入目的是解决Object.assign()无法正确拷贝get和set属性的问题。
1 | const shallowMerge = (target, source) => Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) |
克隆对象
1 | const shallowClone = (obj) => Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj)) |
Mixin混入模式
1 | let mix = (obj) => ({ |
proto属性,Object.setPrototypeOf(),Object.getPrototypeOf()
只有浏览器才部署__proto__属性,所以最好不要使用
__proto__
用来读取或设置当前对象的原型对象
1 | // ES5写法 |
Object.setPrototypeOf() Object.getPrototypeOf()
null或undefined用作第一个参数会报错
Object.keys(),Object.values(),Object.entries()
对象自身可遍历属性的键名/键值
1 | // 过滤属性名为Symbol值的属性 |
1 | // 转成真正的Map结构 |
Object.fromEntries()
1 | // Object.entries的逆操作 |