这是一个对象:
let obj={name:' ',id:undefined,fn:function(){}
}
JSON.stringify(obj)==='{}'
问题:JSON
序列化无法序列化undefined、方法等,所以对象里有这些类型的都无法被识别,所以这个方法是有缺陷的
function objIsNull (obj) {for (let k in obj) {if (obj.hasOwnProperty(k)) {return false}}return true
}
console.log(objIsNull(obj));
hasOwnProperty
来判断这个对象是否有这个k属性,有就说明对象不为空,否则就是空对象,这里封装了函数问题:不能解决不可枚举属性
Object.keys(obj)==0
Object.keys()
是一个静态方法,用于返回一个对象自身的所有可枚举属性的键名(不包括继承的属性和 Symbol 类型的键),以数组形式返回,对象为空的话数组就为0 ,此时就为true问题:不能解决不可枚举属性
Object.getOwnPropertyNames(obj)==0
Object.getOwnPropertySymbols(obj)==0
---------------------------------------
// 结合一下:
Object.getOwnPropertyNames(obj)==0 && Object.getOwnPropertySymbols(obj)==0
Object.getOwnPropertyNames()
是一个静态方法,用于返回一个对象自身的所有属性的键名(包括不可枚举属性,但不包括 Symbol 类型的键),以数组形式返回。 问题:不能返回symbol类Object.getOwnPropertySymbols()
是一个静态方法,用于返回一个对象自身的所有 Symbol 类型属性的键(不包括继承的属性和字符串类型的键),以数组形式返回 问题:不能返回除了symbol类的最终完美版:Reflect.ownKeys()
Reflect.ownKeys(obj)==0
Reflect.ownKeys()
是一个静态方法,可以用于返回一个对象自身的所有属性的键名,包括不可枚举属性和Symbol类型的键。