怎样判别JS对象是不是为空
这儿的空对象指的不是null和undefined
假如要判定是否为null或undefinedjs判断属性是否为空,通过非空判定即可.
const a = null
const b = undefined
console.log(!a) // true
console.log(!b) // true
判定是否为{}
这儿的空对象指的是对象是存在的,而且上面没有任何属性和技巧。
常用解决方案
通过ES6句型Object.keys()进行判别
const a = {
name: 'a'
}
const b = {}
console.log(Object.keys(a).length === 0) // false
console.log(Object.keys(b).length === 0) // true
const a = {
name: 'a'
}
const b = {}
console.log(JSON.stringify(a) === '{}') // false
console.log(JSON.stringify(b) === '{}') // true
const a = {
name: 'a'
}
const b = {}
console.log(Object.getOwnPropertyNames(a).length === 0) // false
console.log(Object.getOwnPropertyNames(b).length === 0) // true
特殊情况
当对象的key为Symbol()数据类型的时侯,以上方案是否还适用呢?
const a = { [Symbol()]: 'a' }
console.log(a) // { [Symbol()]: 'a' }
console.log(JSON.stringify(a) === '{}') // true
console.log(Object.keys(a).length === 0) // true
console.log(Object.getOwnPropertyNames(a).length === 0) // true
每一个都是返回truejs判断属性是否为空,所以结果是错误的。a并非空对象。
这么在Symbol作为key的时侯我们可以考虑使用另外一种方式
getOwnPropertySymbols
console.log(Object.getOwnPropertySymbols(a).length === 0) // false
最终解决方案
1.结合getOwnPropertySymbols和getOwnPropertyNames
const a = { [Symbol()]: 'a' }
const b = { a: 'a' }
const c = {}
console.log(Object.getOwnPropertyNames(a).length === 0 && Object.getOwnPropertySymbols(a).length === 0) // false
console.log(Object.getOwnPropertyNames(b).length === 0 && Object.getOwnPropertySymbols(b).length === 0) // false
console.log(Object.getOwnPropertyNames(c).length === 0 && Object.getOwnPropertySymbols(c).length === 0) // true
Reflect.ownKeys()
const a = { [Symbol()]: 'a' }
const b = { a: 'a' }
const c = {}
console.log(Reflect.ownKeys(a).length === 0) // false
console.log(Reflect.ownKeys(b).length === 0) // false
console.log(Reflect.ownKeys(c).length === 0) // true