es6关于对象新增的几种方法

298 阅读2分钟

这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

问题

面试官:你能讲讲es6新增的Object.is()的方法吗?

面试者:可以,它主要是用来判断两个值是否全等。

面试官: 那它和===有哪些区别?

面试者:额。。。

以上场景纯属虚构,如有雷同,可能是巧合。

今天来学学es6关于对象新增的几种方法。

对象

Object.is()

它主要是用来判断两个值如果是一样的,就相等。但是它和全等操作符===有两个不同:

  1. 全等操作符认为+0-0是相等的,Object.is()认为两个值不一样,是不相等的。
  2. 全等操作符认为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'} 数字会转成字符串

参考

对象的新增方法