ES6新增API:Object篇
source link: https://segmentfault.com/a/1190000040951872
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
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
时,该函数不会抛出错误。
Recommend
-
139
前言 国庆假期已过一半,来篇干货压压惊。 ES6,并不是一个新鲜的东西,ES7、ES8已经赶脚了。但是,东西不在于新,而在于总结。每个学前端的人,身边也必定有本阮老师的《ES6标准入门》或者翻译的《深入理解ECMAScript6》。本篇主要是对ES6的一些
-
118
Sarah Chima ...
-
40
Stripe API ReferenceSessions Sign In →
-
2
Google API storage returns string, not object of credentials advertisements I'm trying to use the google-api for python. I've managed to store...
-
4
Revising ES6 & API {Day - 22} Sep 4 ・1 min read ...
-
4
新增的静态属性ES6在Number对象上新增了一些静态常量属性,用于辅助计算。Number.EPSILONNumber.EPSILON(2-52)代表任意两个数值之间的最小差值,换句话说,如果a与b的差值的...
-
6
大家好,我是前端人,每日分享前端相关内容!今天给大家介绍下 ES6 中的 Map、WeakMap、set 和 WeakSet 的详细使用,以及它们的区别!本篇文章知识点总结如下:
-
3
Chrome 102:新增两个 HTML 属性、两个 JS API !-51CTO.COM
-
4
一文搞懂ES6的Map,Map和Object如何选择更新日期: 2022-08-02阅读: 13标签: map分享...
-
7
Push API: the PushSubscription object explained November 17, 2022 A “push subscription” represents a subscriber to the push notifications of a website. ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK