1、in
如果属性来自对象的原型,仍然返回true

1
2
3
4
5
let obj = {
name:aa'
};
'name' in obj;//true
'toString'in obj;//true

2、Reflect.has()
检查属性是否在对象中,和一样作为函数工作

1
2
3
4
5
const obj = {
name:111
};
Reflect.has(obj,'name');//true
Reflect.has(obj,'toString');//true

3、hasOwnProperty()
返回布尔值,指对象是否具有指定属性作为它自己的属性(不是继承)
可正确区分对象本身属性和其原型的属性

1
2
3
4
5
const obj = {
a:1
};
obj.hasownProperty('a');//true
obj.hasownProperty('toString');//false

缺点:如果对象是用Object.create(null)创建的,不能使用这个方法

1
2
3
const obj object.create(null);
obj.name ='merry';
obj.hasownProperty('name');//Uncaught TypeError:obj.hasownProperty is not a function

4.Object.prototype.hasOwnProperty()
可解决3的问题,本方法直接调用内置有效函数,跳过原型链

1
2
3
4
const obj=object.create(null);
obj.name='merry'
Object.prototype.hasOwnProperty.call(obj,'name')//true
Object.prototype.hasOwnProperty.call(obj,'toString');//false

5、Object.hasOwn()
若对象具有指定属性作为自己的属性,则Object.hasOwn(O静态方法返回true,若属性被继承或不存在,返回false

1
2
3
4
const obj=object.create(null);
obj.name ='merry'
object.hasown(obj,'name');//true
Object.hasOwn(obj,'toString');//false