0
点赞
收藏
分享

微信扫一扫

从一道面试题看 JS 对象属性的遍历

有一道面试题:

如果判断一个对象是否为空对象 {}

空对象,也就是对象身上没有任何属性,所以只要能判断出一个对象的属性个数为 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; 
}


举报

相关推荐

0 条评论