ES6 学习(10) ---对象的扩展

1、Object.is(), // ES6 新增用来比较两个值是否完全相等

  一般比较值是否相等,我们通常使用 == 和 === 运算符,但是对于 -0 和 +0 的相等判断并不准确,同时还有 NaN 并不等于本身,因此ES6,新增Object.is() 方法用于判断两值是否完全相等,大部分情况同 === 运算符

 1 +0 === -0 //true
 2 NaN === NaN // false
 3 
 4 Object.is(+0, -0) // false
 5 Object.is(NaN, NaN) // true
 6 
 7 Object.is('foo', 'foo')
 8 // true
 9 Object.is({}, {}) // 栈中地址不同
10 // false

2、Object.assign() // 用于对象的合并,将源对象的所有枚举属性复制到目标对象。如果有同名属性那么后面的就会覆盖前面的;

1 const target = { a: 1, b: 1 };
2 
3 const source1 = { b: 2, c: 2 };
4 const source2 = { c: 3 };
5 
6 Object.assign(target, source1, source2);
7 target // {a:1, b:2, c:3}

  Object.assign() 只能拷贝到可枚举属性,同时如果对象名为Symbol类型也会拷贝合并

注意:

  1、此方法只是浅拷贝,并不是深拷贝,因此对象中属性值是引用类型,那么拷贝的也只是引用;

  2、同名属性会替换;

  3、如果是数组的话,由于数组的下标相当于对象属性,因此数组合并的话会替换index的值;Object.assign( [1, 2, 3], [4, 5] ) // [4, 5, 3]

  4、取值函数的处理: 如果是取值函数的话,并不会复制取值函数,而是拿到值后将这个值复制过去

1 const source = {
2   get foo() { return 1 }
3 };
4 const target = {};
5 
6 Object.assign(target, source)
7 // { foo: 1 }

3、Object.getOwnPropertyDescriptors() // 获取一个对象下所有的自身属性(非继承属性)的描述对象

  ES5 中 Object.getOwnPropertyDescriptor() 只是获取某一个自身属性

 1 const obj = {
 2   foo: 123,
 3   get bar() { return 'abc' }
 4 };
 5 
 6 Object.getOwnPropertyDescriptors(obj)
 7 // { foo:
 8 //    { value: 123,
 9 //      writable: true,
10 //      enumerable: true,
11 //      configurable: true },
12 //   bar:
13 //    { get: [Function: get bar],
14 //      set: undefined,
15 //      enumerable: true,
16 //      configurable: true } }

4、__proto__属性,Object.setPrototypeof(), Object.getPrototypeof() 

 __proto__ 用于读写对象的原型(prototype), 本质上算是一个内部属性,并不是一个对外的API,尽量避免使用此属性用于对象原型上的读写

 Object.setPrototypeof() 用于设置对象原型对象,如果传入的参数并不是一个对象,那么就会转换成对象,如果是undefined和null不能转成对象那么就会报错

 1 let proto = {};
 2 let obj = { x: 10 };
 3 Object.setPrototypeOf(obj, proto);
 4 
 5 proto.y = 20;
 6 proto.z = 40;
 7 
 8 obj.x // 10
 9 obj.y // 20
10 obj.z // 40

 Object.getPrototypeof() 用于读取对象原型对象, 

5、Object.keys(), Object.values(), Object.entries() 

  ES5 中Object.keys() 返回对象所有可遍历属性的键名所组成的数组;

  ES7 中新增了与其配套的Object.values() Object.entries() 的方法,一般配合 for...of 使用

  Object.values() 返回对象属性值所组成的数组,返回的数组成员的顺序与 属性遍历的 部分排列规则一致。

  Object.values() 只返回对象自身可遍历属性

  Object.entries() 返回对象自身可遍历属性的键值对数组,(如果属性名是Symbol类型的并不会遍历到)

const obj = { foo: '123', baz: 42 };
Object.entries(obj)
// [ ["foo", "123"], ["baz", 42] ]
 1 // 基本用途是遍历对象的属性
 2 let obj = { one: 1, two: 2 };
 3 for (let [k, v] of Object.entries(obj)) {
 4   console.log(
 5     `${JSON.stringify(k)}: ${JSON.stringify(v)}`
 6   );
 7 }
 8 // "one": 1
 9 // "two": 2
10 
11 // Object.entries方法的另一个用处是,将对象转为真正的Map结构。
12 
13 const obj = { foo: 'bar', baz: 42 };
14 const map = new Map(Object.entries(obj));
15 map // Map { foo: "bar", baz: 42 }

6、Object.fromEnties() // 此方法是Object.entries() 的逆操作,即:将键值对数组转换成对象

1 Object.fromEntries([
2   ['foo', 'bar'],
3   ['baz', 42]
4 ])
5 // { foo: "bar", baz: 42 }

  一般也可以将Map对象转换成对象

 1 // 例一
 2 const entries = new Map([
 3   ['foo', 'bar'],
 4   ['baz', 42]
 5 ]);
 6 
 7 Object.fromEntries(entries)
 8 // { foo: "bar", baz: 42 }
 9 
10 // 例二
11 const map = new Map().set('foo', true).set('bar', false);
12 Object.fromEntries(map)
13 // { foo: true, bar: false }
原文地址:https://www.cnblogs.com/newttt/p/12669551.html