有一道面试题:
如果判断一个对象是否为空对象
{}
?
空对象,也就是对象身上没有任何属性,所以只要能判断出一个对象的属性个数为 0,就可以认为它是一个空对象。那么就需要去遍历对象的属性,在遍历之前,需要先了解对象的属性都有哪几种。
Symbol 属性
ES6以前,对象的属性只能字符串类型,即使在设置时将 key 设为其他类型,也会被转为字符串类型进行存储。
ES6提供了 Symbol 符号类型,可以实现作为对象的唯一值属性。这样,对象的属性就有两种类型了:字符串类型和 Symbol 类型。
可枚举属性
每个属性都有一个属性描述符,用于描述属性本身的特性,比如是否可枚举,是否能删除,值是什么。
给一个对象直接定义的属性,都是可枚举的,可删除的,值也确定的。可以通过 Reflect.defineProperty
来设置属性的描述符,将其变为不可枚举的:
let person = {
name: 'jack',
age: 18
}
Reflect.defineProperty(person, 'age', {
enumerable: false,
})
这样,for in 、Object.keys 这两个方法
遍历属性的方法
下面是几种遍历对象属性的方式。
- for in:遍历自己和原型上的可枚举属性(不包括 Symbol 属性)
- Object.keys:只遍历自己的可枚举属性
- Object.getOwnPropertyNames:遍历自己的所有属性,包括不可枚举属性,但不包括 Symbol 属性
- Object.getOwnPropertySymbols:遍历自己的所有 Symbol 属性,包括不可枚举的 Symbol 属性
- Reflect.ownKeys:遍历自己的所有属性,无论是否可枚举,无论是否是 Symbol 属性
可见,Reflect.ownKeys 方法是最全能,最准确的一个方法。
了解了这些常用的遍历属性的方法,就能很轻松的写一个判断空对象的方法了:
function isEmpty(object) {
return Reflect.ownKeys(object).length === 0;
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net