ES6|ES6 对象 (Object) 新增方法

1. is()

  • 作用:Object.is(obj1, obj2) 用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致,但在 +0 和 -0 以及NaN比较上有区别
5 == 5; // true 5 === 5; // true Object.is(5, 5); // true5 == “5”; // true 5 === “5”; // false Object.is(5, “5”); // false+0 == -0; // true +0 === -0; // true Object.is(+0, -0); // falseNaN == NaN; // false NaN === NaN; // false Object.is(NaN, NaN); // true

2. assign()
  • 作用:Object.assign(target, ...source) 用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象,其中源对象可以有多个。如果出现多个重名属性,后面的属性将覆盖前面的属性。
function s1() {} s1.prototype = { constructor: s1, n: “s1”, value: 4, obj: {value: 1} }; const s2 = { value: 8 }; const target = { value: 16}; Object.assign(target, s1, s2); console.log(target.n); // s1 console.log(target.value); // 8 console.log(target.obj.value); // 1s1.obj.value = https://www.it610.com/article/2; console.log(target.obj.value); // 2

需要注意的是,由于Object.assign()方法实行的是浅拷贝,而不是深拷贝,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。上面例子中,如果改变 s1.obj.value 的值, target.obj.value 也会随之改变。
3. setPrototypeOf(), getPrototypeof()
  • setPrototypeOf(object, prototype)
    作用:ES6 正式推荐的设置原型对象的方法,返回参数本身对象。
let obj = {}; let porto = {value: 1}; Object.setPrototypeOf(obj, porto); obj.value =https://www.it610.com/article/== 1; // true

如果第一个参数不是一个对象,则会自动转换成一个对象。但是由于返回还是第一个参数,所以不会有任何效果。
Object.setPrototypeOf(1, {}) === 1; // true Object.setPrototypeOf(‘str’, {}) === ‘str’; // true Object.setPrototypeOf(true, {}) === true; // true

【ES6|ES6 对象 (Object) 新增方法】但是由于 undefined 以及 null 无法被转换成一个对象,所以会报错。
Object.setPrototypeOf(undefined, {}); // 报错 Object.setPrototypeOf(null, {}); // 报错

  • getPrototypeOf(obj)
    作用:用于读取一个对象的原型对象。
function func() {/* */} const rec = new func(); Object.getPrototypeOf(rec) === func.prototype; // trueObject.setPrototypeOf(rec, Object.prototype); Object.getPrototypeOf(rec) === func.prototype; // false

如果参数不是对象,会被自动转为对象。
Object.getPrototypeOf(1); // Number {[[PrimitiveValue]]: 0} Object.getPrototypeOf('str'); // String {length: 0, [[PrimitiveValue]]: ""} Object.getPrototypeOf(true); // Boolean {[[PrimitiveValue]]: false}Object.getPrototypeOf(1) === Number.prototype; // true Object.getPrototypeOf('foo') === String.prototype; // true Object.getPrototypeOf(true) === Boolean.prototype; // true

如果参数是 undefined 或 null,它们无法转为对象,所以会报错。
Object.getPrototypeOf(null); // TypeError Object.getPrototypeOf(undefined); // TypeError

4. keys(), values(), entries()
  • keys(object)
    作用:返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名。
const obj = { str: “bar”, value: 42 }; Object.keys(obj); // [“str”, “value”]

  • values(object)
    作用:返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值。
const obj = { str: “bar”, value: 42 }; Object.values(obj); // [“bar”, 42]

  • entries(object)
    作用:返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。
const obj = { str: “bar”, value: 42 }; Object.entries(obj); // [[“str”, “bar”], [“value”, 42]]

6. fromEntries()
作用:用于将一个键值对数组转为对象。
const entries = new Map([ [‘str’, ‘bar’], [‘value’, 42] ]); Object.fromEntries(entries); // { str: “bar”, value: 42 }

    推荐阅读