共计 1788 个字符,预计需要花费 5 分钟才能阅读完成。
1.Object.is
函数类型:
(v1:any,v2:any)=>boolean;
// 接管两个用于比拟是否相等的值,返回一个布尔值后果
Object.is(...)
函数的比拟规定和严格相等 ===
基本相同,然而有两个非凡的值——NaN
和-0
,须要留神:
当进行严格相等的比拟时,NaN
自身是 不相等 的,+0
和 -0
是相等 的:
NaN===NaN;//false
0===-0;//true
然而在 Object.is(...)
的判断规定中,NaN
是 相等 的,+0
和 -0
是不相等 (因为+
,-
能够代表方向,-
在代码中个别是有意义的):
Object.is(NaN,NaN);//true
Object.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
时,该函数不会抛出谬误。