1、in Operator
如果指定属性在指定对象或其原型链中,则in Operator返回true。
但是in Operator有个缺点,那就是:如果属性来自对象的原型,它仍然会返回true。
2、Reflect.has()方法
Reflect.has方法允许我们检查属性是否在对象中。它像in Operator一样作为函数工作。
3、hasOwnProperty()方法
hasOwnProperty()方法返回一个布尔值,指示对象是否具有指定的属性作为它自己的属性(而不是继承它)。它可以正确地区分对象的属性和其原型的属性。
但是这种写法有个缺点,就是如果对象是用Object.create(null)创建的话,那么就不能用这个方法了
4、Object.prototype.hasOwnProperty()方法
解决前面的问题很简单,我们只需要使用Object.prototype.hasOwnProperty。该方法是直接调用内置的有效函数,跳过原型链。
5、Object.hasOwn()方法
由于前面的几种方式都不优雅,ES2022有一个新的提议:Object.hasOwn 如果指定的对象具有指定的属性作为其自己的属性,则Object.hasOwn()静态方法返回true。如果属性被继承或不存在,则该方法返回false