这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战
问题
面试官:你能讲讲es6新增的Object.is()
的方法吗?
面试者:可以,它主要是用来判断两个值是否全等。
面试官: 那它和===
有哪些区别?
面试者:额。。。
以上场景纯属虚构,如有雷同,可能是巧合。
今天来学学es6关于对象新增的几种方法。
对象
Object.is()
它主要是用来判断两个值如果是一样的,就相等。但是它和全等操作符===
有两个不同:
- 全等操作符认为
+0
和-0
是相等的,Object.is()认为两个值不一样,是不相等的。 - 全等操作符认为NaN和本身相比是不相等的,Object.is()认为NaN和本身是一样的,是相等的。
除此之外,其它行为和全等操作符的判断是一样的。
+0 === -0 // true
NaN === NaN // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true
var a = {}
Object.is(a, {}) // false
Object.is('123', 123) // false
Object.is(a, a) // true
Object.is(123, 123) // true
Object.getOwnPropertyDescriptor(target, key)
这个是获取对象的某个key的描述对象,比如value值,是否可写,是否可遍历,是否可配置等。
var obj = {a: 1}
Object.getOwnPropertyDescriptor(obj, 'a')
// 返回如下
// {
// value: 1,
// writable: true,
// enumerable: true,
// configurable: true
// }
它可以和Object.defineProperty
配合一起使用。
实现复制某个属性的描述对象,比如下面的a属性
var obj = {a: 1}
var obj1 = Object.defineProperty({}, 'a', Object.getOwnPropertyDescriptor(obj, 'a'))
console.log(obj1) // {a: 1}
var obj = {get a () {return '123'}}
var obj1 = Object.defineProperty({}, 'a', Object.getOwnPropertyDescriptor(obj, 'a'))
console.log(obj1) // {a: 1, get a: ƒ a()}
还有个Object.getOwnPropertyDescriptors
,这个是获取所以属性的描述对象。
var obj = {a: 1, b:2}
Object.getOwnPropertyDescriptors(obj)
Object.setPrototypeOf() 和 Object.getPrototypeOf()
这个是用来设置对象的原型链对象,和获取对象的原型链对象。
setPrototypeOf接受2个参数,一个是目标对象,一个是原型链对象。
getPrototypeOf接受一个参数,目标对象。如果不是对象,会转成对象,如果该值不能转,则会报错。(比如undefined
/null
)
var obj = {a:123}
var proto = {proto: 'proto'}
Object.setPrototypeOf(obj, proto)
console.log(obj) // {a: 123, [[Prototype]]:{proto: "proto"}}
console.log(Object.getPrototypeOf(obj)) // {proto: 'proto'}
console.log(Object.getPrototypeOf(undefined)) // error
console.log(Object.getPrototypeOf(1) === Number.prototype) // true
Object.entries()
这个是获取对象的键值对,通过数组返回。
var obj = {a: 1, b:2}
console.log(Object.entries(obj)) // [['a', 1], ['b', 2]]
这个不能输出Symbol的属性,这个需要注意。
var obj = {a: 1, b:2, [Symbol('s')]: 3}
console.log(Object.entries(obj)) // [['a', 1], ['b', 2]] 没有symbol属性
Object.fromEntries()
这个是把符合格式参数的键值对转成对象。键值对参考Object.entries()的返回值。
var obj = Object.fromEntries([['a', 1], ['b', 2]])
console.log(obj) // {a: 1, b:2}
也可以将Map结构或者URLSearchParams
对象的参数转成对象
var map = new Map([['a', 1], ['b', 2]])
var obj = Object.fromEntries(map)
console.log(obj) // {a: 1, b:2}
var search = new URLSearchParams('a=1&b=2')
var obj = Object.fromEntries(search)
console.log(obj) // {a: '1', b:'2'} 数字会转成字符串