ES6的对象新增的方法

版权声明:可以装载,装载请在第一行注明出处。本人文章如有侵权,请凉席本人删除 https://blog.csdn.net/weixin_43532346/article/details/84990057
  1. Object.is() 严格比较两个值是否相等
    ES5 比较两个值是否相等,只有两个运算符:相等运算符()和严格相等运算符(=)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。
    Object.is就是部署这个算法的新方法。它用来比较两个值是否严格相等.不同:一是+0不等于-0,二是NaN等于自身。

  2. Obejct.assign() 对象合并
    Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
    Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。
    Object.assign拷贝的属性是有限制的,只拷贝源对象的自身属性(不拷贝继承属性),也不拷贝不可枚举的属性(enumerable: false)。
    属性名为 Symbol 值的属性,也会被Object.assign拷贝。

    注意,如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。
    

    如果只有一个参数,Object.assign会直接返回该参数。
    如果该参数不是对象,则会先转成对象,然后返回。

    由于undefined和null无法转成对象,所以如果它们作为参数,就会报错。如果非对象参数出现在源对象的位置(即非首参数),那么处理规则有所不同。首先,这些参数都会转成对象, 如果无法转成对象,就会跳过。这意味着,如果undefined和null不在首参数,就不会报错。
    其他类型的值(即数值、字符串和布尔值)不在首参数,也不会报错。但是,除了字符串会以数组形式,拷贝入目标对象,其他值都不会产生效果。

const v1 = 'abc';
const v2 = true;
const v3 = 10;

const obj = Object.assign({}, v1, v2, v3);
console.log(obj); // { "0": "a", "1": "b", "2": "c" }
//上面代码中,v1、v2、v3分别是字符串、布尔值和数值,结果只有字符串合入目标对象(以字符数组的形式),数值和布尔值都会被忽略。这是因为只有字符串的包装对象,会产生可枚举属性。

注意点 :
(1)浅拷贝
Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用

(2)同名属性的替换
对于这种嵌套的对象,一旦遇到同名属性,Object.assign的处理方法是替换,而不是添加。

(3)数组的处理
Object.assign可以用来处理数组,但是会把数组视为对象。

(4)取值函数的处理
Object.assign只能进行值的复制,如果要复制的值是一个取值函数,那么将求值后再复制。

常见用途:
(1)为对象添加属性

class Point {
  constructor(x, y) {
    Object.assign(this, {x, y});
  }
}
上面方法通过Object.assign方法,将x属性和y属性添加到Point类的对象实例。

(2)为对象添加方法
(3)克隆对象
(4)合并多个对象
(5)为属性指定默认值

  1. Object.getOwnPropertyDescriptors()
    ES5 的Object.getOwnPropertyDescriptor()方法会返回某个对象属性的描述对象(descriptor)。ES2017 引入了Object.getOwnPropertyDescriptors()方法,返回指定对象所有自身属性(非继承属性)的描述对象。
    该方法主要是为了解决Object.assign()无法正确拷贝get属性和set属性的问题。
    Object.getOwnPropertyDescriptors()方法配合Object.defineProperties()方法,就可以实现正确拷贝。
const shallowMerge = (target, source) => Object.defineProperties(
  target,
  Object.getOwnPropertyDescriptors(source)
);

Object.getOwnPropertyDescriptors()方法的另一个用处,是配合Object.create()方法,将对象属性克隆到一个新对象。这属于浅拷贝。

Object.getOwnPropertyDescriptors()方法可以实现一个对象继承另一个对象。
ES6 规定__proto__只有浏览器要部署,其他环境不用部署。
Object.getOwnPropertyDescriptors()也可以用来实现 Mixin(混入)模式

  1. __proto__属性,Object.setPrototypeOf(),Object.getPrototypeOf()
    (1)__proto__属性(前后各两个下划线),用来读取或设置当前对象的prototype对象。目前,所有浏览器(包括 IE11)都部署了这个属性。
// es5 的写法
const obj = {
  method: function() { ... }
};
obj.__proto__ = someOtherObj;

// es6 的写法
var obj = Object.create(someOtherObj);
obj.method = function() { ... };

__proto__前后的双下划线,说明它本质上是一个内部属性,而不是一个正式的对外的 API,只是由于浏览器广泛支持,才被加入了 ES6。
无论从语义的角度,还是从兼容性的角度,都不要使用这个属性,而是使用下面的Object.setPrototypeOf()(写操作)、Object.getPrototypeOf()(读操作)、Object.create()(生成操作)代替。
如果一个对象本身部署了__proto__属性,该属性的值就是对象的原型。Object.getPrototypeOf({ proto: null })// null

(2)Object.setPrototypeOf()
Object.setPrototypeOf方法的作用与__proto__相同,用来设置一个对象的prototype对象,返回参数对象本身。它是 ES6 正式推荐的设置原型对象的方法。

// 格式
Object.setPrototypeOf(object, prototype)
// 用法
const o = Object.setPrototypeOf({}, null);

//该方法等同于下面的函数
function setPrototypeOf(obj, proto) {
  obj.__proto__ = proto;
  return obj;
}
//由于undefined和null无法转为对象,所以如果第一个参数是undefined或null,就会报错

Object.setPrototypeOf(undefined, {})
// TypeError: Object.setPrototypeOf called on null or undefined

Object.setPrototypeOf(null, {})
// TypeError: Object.setPrototypeOf called on null or undefined

(3)Object.getPrototypeOf()
该方法与Object.setPrototypeOf方法配套,用于读取一个对象的原型对象。Object.getPrototypeOf(obj);
如果参数不是对象,会被自动转为对象。
如果参数是undefined或null,它们无法转为对象,所以会报错。

  1. Object.keys(),Object.values(),Object.entries()
    (1)Object.keys()
    ES5 引入了Object.keys方法,返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名。
    ES2017 引入了跟Object.keys配套的Object.values和Object.entries,作为遍历一个对象的补充手段,供for…of循环使用。

    (2)Object.values()
    Object.values方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值。
    Object.values会过滤属性名为 Symbol 值的属性。
    如果Object.values方法的参数是一个字符串,会返回各个字符组成的一个数组。
    如果参数不是对象,Object.values会先将其转为对象。由于数值和布尔值的包装对象,都不会为实例添加非继承的属性。所以,Object.values会返回空数组。
    (3)Object.entries()
    Object.entries()方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键值对数组。
    除了返回值不一样,该方法的行为与Object.values基本一致。
    如果原对象的属性名是一个 Symbol 值,该属性会被忽略。
    Object.entries的基本用途是遍历对象的属性。
    Object.entries方法的另一个用处是,将对象转为真正的Map结构。

  2. Object.fromEntries()
    Object.fromEntries()方法是Object.entries()的逆操作,用于将一个键值对数组转为对象。
    该方法的主要目的,是将键值对的数据结构还原为对象,因此特别适合将 Map 结构转为对象。
    该方法的一个用处是配合URLSearchParams对象,将查询字符串转为对象

Object.fromEntries([
  ['foo', 'bar'],
  ['baz', 42]
])
// { foo: "bar", baz: 42 }


// 例一
const entries = new Map([
  ['foo', 'bar'],
  ['baz', 42]
]);

Object.fromEntries(entries)
// { foo: "bar", baz: 42 }

// 例二
const map = new Map().set('foo', true).set('bar', false);
Object.fromEntries(map)
// { foo: true, bar: false }


Object.fromEntries(new URLSearchParams('foo=bar&baz=qux'))
// { foo: "bar", baz: "qux" }
  1. 详细参考 http://es6.ruanyifeng.com/#docs/object-methods

猜你喜欢

转载自blog.csdn.net/weixin_43532346/article/details/84990057