1.Object.is

函数类型:

(v1:any,v2:any)=>boolean;//接管两个用于比拟是否相等的值,返回一个布尔值后果

Object.is(...)函数的比拟规定和严格相等===基本相同,然而有两个非凡的值——NaN-0,须要留神:

当进行严格相等的比拟时,NaN自身是不相等的,+0-0相等的:

NaN===NaN;//false0===-0;//true

然而在Object.is(...)的判断规定中,NaN相等的,+0-0不相等(因为+-能够代表方向,-在代码中个别是有意义的):

Object.is(NaN,NaN);//trueObject.is(0,-0);//false

也正是因而,当咱们须要严格地判断NaN-0时,能够应用Object.is(...),这个函数并不能代替===

2.Object.getOwnPropertySymbols

函数类型:

(obj:any)=>Symbol[];//承受一个对象,返回这个对象中所有Symbol类型的键组成的数组,不存在Symbol属性时,返回空数组

ES6中新增了一个根本类型Symbol,因为Symbol的值举世无双的个性,应用Symbol作为对象的属性是很有吸引力的。Object.getOwnPropertySymbols(...)这个办法就是为了获得对象上所有的Symbol属性。

const obj = {    [Symbol('prop')]: '我是symbol属性的值',    [Symbol.iterator]() {        return this;    },};console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(prop), Symbol(Symbol.iterator) ]

3.Object.setPrototypeOf

函数类型:

<T>(obj:T,prototype:Object|null)=>T;//该函数会将prototype设为obj的原型对象,返回值为obj本身

相较于通过__proto__属性批改原型对象obj.__proto__ = prototype,应用Object.setPrototypeOf(obj,protorype)是更加合乎标准的,所以当咱们有批改原型对象的需要时,最好应用Object.setPrototypeOf(...)

然而须要留神的是,批改一个对象的原型对象的操作是很慢的,这种行为也会使代码变得更难懂。咱们最好是防止批改对象的原型对象,能够通过Object.create(...)创立带有咱们想要的原型对象的对象。

const obj = {};const obj2 = {    name: 'obj2',};//尽量避免Object.setPrototypeOf(obj, obj2);//略微举荐const obj3 = Object.create(obj2);console.log(obj.name, obj3.name);//obj2 obj2

4.Object.assign

函数类型:

<T,U>(target:T,...objs:U[])=>T&U;//将所有可枚举属性的值从一个或多个源对象调配到指标对象,返回指标对象target

Object.assgin(...)的第一个参数是指标对象,其余的参数都是要复制属性的数据源对象。该函数会按照数据源对象传入的程序,顺次将数据源对象中的可枚举的本身领有的(非原型链上的)属性,浅复制到指标对象上。

const obj = {    self: 'self',};const obj2 = {    name: 'obj2',};Object.setPrototypeOf(obj, obj2);Object.defineProperty(obj, 'notEnumerable', {    enumerable: false,});const target = {};Object.assign(target, null, undefined, obj);//name属性是obj的原型对象obj2上的属性,obj的notEnumerable是不可枚举的,所以最终只复制了一个self属性console.log(target);//{ self: 'self' }

须要留神的是,当数据源对象传入的是null或者undefined时,该函数不会抛出谬误。