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']