【ES6+】新增的Object API
Object.is
用于判断两个数据是否相同,与===基本一致,但有两点不同:
- NaN等于自身
- +0不等于-0
js
console.log(NaN === NaN); // false
console.log(+0 === -0); // true
Object.is(NaN, NaN); // true
Object.is(+0, -0); // falseObject.assign
用于合并对象,将源对象(source)中可枚举的属性,复制到目标对象中(target),如果有同名属性,则后面的属性会覆盖前面的属性。
js
var target = { a: 1, b: 1 };
var source1 = { b: 2, c: 2 };
var source2 = { c: 3 };
Object.assign(target, source1, source2);
console.log(target); // { a:1, b:2, c:3 }
// Object.assign方法实现的是浅克隆
var obj1 = {a: { b: 1 }};
var obj2 = Object.assign({}, obj1);
obj1.a.b = 2;
console.log(obj2.a.b); // 2Object.keys
ES5引入了Object.keys方法,返回一个数组,数组成员是对象中可遍历的属性名,不包含Symbol属性和原型链中的属性名。
js
var obj = { foo: 'bar', baz: 42, [Symbol()]: 'symbol' };
Object.keys(obj); // ["foo", "baz"]Object.values
ES2017引入了Object.values方法,返回一个数组,数组成员是对象中可遍历的属性值,不包含Symbol属性和原型链中的属性值。
js
var obj = { foo: 'bar', baz: 42, [Symbol()]: 'symbol' };
Object.values(obj); // ["bar", 42]Object.entries
ES2017引入了Object.entries方法,返回一个二维数组,数组成员是对象中遍历的属性名和属性值,不包含Symbol属性和原型链中的属性名和属性值。
js
var obj = { foo: 'bar', baz: 42, [Symbol()]: 'symbol' };
Object.entries(obj); // [["foo", "bar"], ["baz", 42]]通常配合for...of来遍历对象属性。
js
for(var [k, v] of Object.entries(obj)) {
console.log(k, v);
}另一个用法是将对象转换为Map结构。
js
var map = new Map(Object.entries(obj));Object.fromEntries
ES2019引入了Object.fromEntries方法,该方法是Object.entries的逆操作,将一个键值对数组转换为对象。
js
var kvArr = [['foo', 'bar'], ['baz', 42]];
var obj = Object.fromEntries(kvArr); // { foo: "bar", baz: 42 }该方法常用于将Map结构转换为对象。
js
const map = new Map().set('foo', true).set('bar', false);
var obj = Object.fromEntries(map); // { foo: true, bar: false }Object.setPrototypeOf
它的作用和__proto__一样,用于给对象设置原型对象,返回对象本身,但是__proto__不属于web标准,实际上__proto__是各大浏览器产商实现的,因此我们推荐使用Objet.setPrototypeOf。
js
let proto = {};
let obj = { x: 10 };
Object.setPrototypeOf(obj, proto);
proto.y = 20;
console.log(obj.x); // 10
console.log(obj.y); // 20Object.getPrototypeOf
用于获取对象的原型对象。
js
function Person() {};
var p = new Peroson();
console.log(Object.getPrototypeOf(p) === Peroson.prototype); // true