ES6 对象 (Object) 新增方法

1. is()

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

5 == “5”;          // true
5 === “5”;         // false
Object.is(5, “5”); // false

+0 == -0;          // true
+0 === -0;         // true
Object.is(+0, -0); // false

NaN == 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);  // 1

s1.obj.value = 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 === 1;  // true

如果第一个参数不是一个对象,则会自动转换成一个对象。但是由于返回还是第一个参数,所以不会有任何效果。

Object.setPrototypeOf(1, {}) === 1;  // true
Object.setPrototypeOf(‘str’, {}) === ‘str’;  // true
Object.setPrototypeOf(true, {}) === true;  // true

但是由于 undefined 以及 null 无法被转换成一个对象,所以会报错。

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

Object.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 }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.属性的简洁表示法 允许直接写入变量和函数 上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量...
    雨飞飞雨阅读 1,165评论 0 3
  • 属性的简洁表示法 ES6允许直接写入变量和函数,作为对象的属性和方法。 上面代码表明,ES6允许在对象之中,直接写...
    oWSQo阅读 525评论 0 0
  • 属性的简洁表示法 ES6允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁。 上面代码表明,ES6允...
    呼呼哥阅读 2,948评论 0 2
  • 一、属性的简介表示法 ES6允许直接写入变量和函数作为对象的属性和方法。允许在对象中只写属性名,不写属性值。这时,...
    了凡和纤风阅读 346评论 0 0
  • 一、概览 Object.is() Object.assign() Object.getOwnPropertyDes...
    HalShaw阅读 2,202评论 0 0