【对象】面试高频题:JS判断对象是否为空的几种方法

这是一个对象:

let obj={
    name:' ',
    id:undefined,
    fn:function(){}
}

方法:

1.JSON.stringify()

JSON.stringify(obj)==='{}'

问题:JSON序列化无法序列化undefined、方法等,所以对象里有这些类型的都无法被识别,所以这个方法是有缺陷的

2. for in + hasOwnProperty

function objIsNull (obj) {
  for (let k in obj) {
    if (obj.hasOwnProperty(k)) {
      return false
    }
  }
  return true
}
console.log(objIsNull(obj));
  • 通过for in遍历对象的可枚举属性,通过hasOwnProperty来判断这个对象是否有这个k属性,有就说明对象不为空,否则就是空对象,这里封装了函数

问题:不能解决不可枚举属性

3. Object.keys()

Object.keys(obj)==0
  • Object.keys()是一个静态方法,用于返回一个对象自身的所有可枚举属性的键名(不包括继承的属性和 Symbol 类型的键),以数组形式返回,对象为空的话数组就为0 ,此时就为true

问题:不能解决不可枚举属性

4.getOwnPropertyNames+getOwnPropertySymbols

Object.getOwnPropertyNames(obj)==0
Object.getOwnPropertySymbols(obj)==0
---------------------------------------
// 结合一下:
Object.getOwnPropertyNames(obj)==0 && Object.getOwnPropertySymbols(obj)==0 
  • Object.getOwnPropertyNames()是一个静态方法,用于返回一个对象自身的所有属性的键名(包括不可枚举属性,但不包括 Symbol 类型的键),以数组形式返回。 问题:不能返回symbol类
  • Object.getOwnPropertySymbols() 是一个静态方法,用于返回一个对象自身的所有 Symbol 类型属性的键(不包括继承的属性和字符串类型的键),以数组形式返回 问题:不能返回除了symbol类的
  • 可以二者结合使用来判断

5. 最终完美版:Reflect.ownKeys()

Reflect.ownKeys(obj)==0
  • Reflect.ownKeys() 是一个静态方法,可以用于返回一个对象自身的所有属性的键名,包括不可枚举属性和Symbol类型的键。

你可能感兴趣的:(#,javascript,前端,javascript,前端)