在前端开发中,我们经常需要判断一个对象是否拥有某个属性。在 ES6 之前,我们通常使用 in
运算符或者 Object.prototype.hasOwnProperty
方法来实现。而在 ES6 中,新增了 Reflect.has
方法,可以更方便地判断一个对象是否拥有某个属性。而在 ES12 中,又新增了 Object.hasOwn
方法,用于判断一个对象自身是否拥有某个属性。
Object.hasOwn 方法的语法
Object.hasOwn
方法的语法如下:
Object.hasOwn(obj, prop)
其中,obj
表示要判断的对象,prop
表示要判断的属性名称。
Object.hasOwn 方法的返回值
Object.hasOwn
方法返回一个布尔值,表示该对象自身是否拥有该属性。如果该对象自身拥有该属性,则返回 true
,否则返回 false
。
Object.hasOwn 方法的应用
判断对象是否拥有某个属性
使用 Object.hasOwn
方法可以更方便地判断一个对象是否拥有某个属性。例如:
const obj = { name: '张三', age: 18 } console.log(Object.hasOwn(obj, 'name')) // true console.log(Object.hasOwn(obj, 'gender')) // false
避免出现属性名为 hasOwnProperty
的对象
在使用 Object.prototype.hasOwnProperty
方法时,如果对象本身拥有一个名为 hasOwnProperty
的属性,那么调用该方法会出现问题。而使用 Object.hasOwn
方法则可以避免这个问题。例如:
const obj = { hasOwnProperty: true, name: '张三', age: 18 } console.log(Object.hasOwn(obj, 'name')) // true console.log(Object.hasOwn(obj, 'hasOwnProperty')) // true
Object.hasOwn 方法的原理
Object.hasOwn
方法的实现原理与 Object.prototype.hasOwnProperty
方法类似,都是通过检查对象的 [[Prototype]]
链来判断该对象是否拥有某个属性。
具体来说,Object.hasOwn
方法会先将 obj
转换为对象,然后使用 Reflect.ownKeys
方法获取该对象自身的所有属性名(包括不可枚举的属性),最后判断 prop
是否在这些属性名中。如果在,则返回 true
,否则返回 false
。
下面是 Object.hasOwn
方法的简化实现:
function hasOwn(obj, prop) { const keys = Reflect.ownKeys(Object(obj)) return keys.includes(prop) }
总结
Object.hasOwn
方法是 ES12 新增的一个方法,用于判断一个对象自身是否拥有某个属性。它的语法简单,返回值为布尔值,应用场景广泛。同时,它的实现原理也很简单,通过检查对象的 [[Prototype]]
链来判断该对象是否拥有某个属性。在实际开发中,我们可以根据需要选择使用 Object.hasOwn
方法、Object.prototype.hasOwnProperty
方法或者 Reflect.has
方法来判断对象是否拥有某个属性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/663c39e1d3423812e4a18060