ES2022新特性:Object.hasOwn()以及判断对象是否具有属性的6个方法

2023-12-16 11:31:30

Object.hasOwn() 主要是用来代替Object.prototype.hasOwnProperty(),提供了一个更简单的方法来检查对象是否具有特定的属性。

来看一下检查对象是否具有某属性的方法:

1. in操作符

'name' in {name:'hhh'}? // true

'name' in {}? //false

// 注意name一定是带引号的表示属性的,如果去掉引号name in {name:'hhh'}则是false

缺点是in会检查继承过来的属性

'valueOf' in {}
true
'toString' in {}
true

// 因为{}继承了Object.prototype.toString()方法

2. Reflect.has()

Reflect.has是ES2015新增的一个内置对象,提供了与JavaScript对象交互的方法。

判断一个对象是否存在某个属性,与in操作符的功能完全相同。

Reflect.has({name:"zhangsan"},"name") // true
Reflect.has({name:"zhangsan"},"age") // true

Reflect.has({},'toString')
true
Reflect.has({},'valueOf')
true

3. hasOwnProperty()

hasOwnProperty用来判断一个对象是否拥有特定的自身属性,可以判断一个属性是定义在对象本身而不是继承自原型链的。

通过对象字面量{}或构造函数法new Object()创建的对象都从Object.prototype继承了hasOwnProperty()

const o = {name:'zhangsan'}

o.hasOwnProperty('name') //true

o.hasOwnProperty('toString')
false

缺点:不支持Object.create(); 如果对象本身有一个‘hasOwnProperty’属性,将覆盖原型链上的Object.prototype.hasOwnProperty()。

const o = Object.create(null)
o.hasOwnProperty('name')

//会报错 Uncaught TypeError: o.hasOwnProperty is not a function

const o = Object.create({name:'11'})
o.hasOwnProperty('name')
false

4.?Object.prototype.hasOwnProperty()

Object.prototype.hasOwnProperty.call(obj,propName)

const o = {name:'zhangsan'}

Object.prototype.hasOwnProperty.call(o,'name') //true

Object.prototype.hasOwnProperty.call(o,'toString')
false

5. Object.hasOwn()

用来代替Object.prototype.hasOwnProperty.call()

function hasOwn(obj,propName){

    return Object.prototype.hasOwnProperty.call(obj,propName)
}

6. Object.keys(obj).includes()

const o = {name:'zhangsan'}


Object.keys(o).includes('name') // true


Object.keys(o)
['name']

文章来源:https://blog.csdn.net/content6/article/details/135029127
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。