这是一个对象:
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类型的键。