下面介绍查询某个对象是否有某个属性的四种方法,以及对可枚举属性和不可枚举属性的补充。
1. 使用对象的hasOwnProperty()
方法:
const obj = {
name:'Gaga',
age: 18
}
console.log(obj.hasOwnProperty('age')); // true
console.log(obj.hasOwnProperty('gender')); // false
- 如果对象具有指定属性,则返回
true
,否则返回false
。根据返回值可以判断对象是否具有指定属性。
2. 使用in
操作符:
const obj = {
name:'Gaga',
age: 18
}
console.log('name' in obj); // true
console.log('gender' in obj); // false
in
操作符会检查属性是否存在于对象本身,以及是否存在于原型链上。因此,可能会返回意料之外的结果。
3. 使用Object.keys()
方法:
const obj = {
name:'Gaga',
age: 18
}
// 使用Object.keys()方法可以获取对象的所有属性
let keys = Object.keys(obj) // [ 'name', 'age' ]
console.log(keys.includes('name')); // true
console.log(keys.includes('gender')); // false
Object.keys()
方法只返回对象自身可枚举属性的数组,不包括原型链上的属性。- 如果想要获取对象的所有属性,包括不可枚举属性,可以使用
Object.getOwnPropertyNames()
方法。
4. 使用Object.getOwnPropertyNames()
方法:
const obj = {
name:'Gaga',
age: 18,
state: true,
address:'CH'
}
// 使用Object.getOwnPropertyNames()方法获取对象的所有自身属性(包括不可枚举属性)
let propertyNames = Object.getOwnPropertyNames(obj);
console.log(propertyNames); // [ 'name', 'age', 'state', 'address' ]
console.log(propertyNames.includes('name')); //true
console.log(propertyNames.includes('gender')); //false
Object.getOwnPropertyNames()
方法会返回对象的所有自身属性,包括可枚举和不可枚举属性。
补充:
在JavaScript中,对象的属性可以分为可枚举属性和不可枚举属性。可枚举属性是指可以通过for...in
循环或Object.keys()
方法获取的属性,而不可枚举属性则是指不能通过这些方式获取的属性。
在对象创建时,默认情况下,所有直接添加到对象的属性都是可枚举的。但是,有些属性是不可枚举的,例如通过Object.defineProperty()
方法定义的属性,默认是不可枚举的。 不可枚举属性通常用于存储对象的内部信息,而不是用于外部访问。这样可以避免意外修改或删除这些属性,同时不会影响对象的遍历操作。 下面通过代码来演示:
const obj = {
name:'Gaga',
age: 18
}
// 使用Object.defineProperty()定义不可枚举属性
Object.defineProperty(obj, 'gender', {
value: 'female',
enumerable: false // 将gender属性设置为不可枚举
});
// 遍历对象的属性
for (let key in obj) {
console.log(key); // 输出'name'和'age',但不会输出'gender'
}
// 使用Object.keys()获取对象的属性
let keys = Object.keys(obj);
console.log(keys); // 输出['name', 'age']
// 使用Object.getOwnPropertyNames()方法获取对象的所有自身属性(包括不可枚举属性)
let propertyNames = Object.getOwnPropertyNames(obj);
console.log(propertyNames); // 输出[ 'name', 'age', 'gender' ]