先说结论 Reflect.ownKeys({}).length === 0
这样来判断对象是否为空
- JSON.stringify(obj) === '{}'
var obj = {
a: undefined,
b: function(){},
c: Symbol()
}
console.log(JSON.stringify(obj) === '{}') // true
如果存在undefined,函数,Symbol值, 序列化过程中会被忽略。
- for in 和 hasOwnProperty
const obj = {}
Object.prototype.a = 1;
function isEmpty (obj) {
let flag = true
for (let o in obj) {
if (obj.hasOwnProperty(o)) {
flag = false
break
}
}
return flag
}
console.log(isEmpty(obj)) // true
但是 for in 不能遍历不可枚举的属性
const obj = {}
Object.prototype.a = 1;
function isEmpty (obj) {
let flag = true
for (let o in obj) {
if (obj.hasOwnProperty(o)) {
flag = false
break
}
}
return flag
}
//
const ykx = {}
Object.defineProperty(ykx, "sex", {
value: "male",
//是否为枚举属性
enumerable: false
});
console.log(isEmpty(obj)) // true
console.log(isEmpty(ykx)) // false
- Object.keys 同 for in 一样不能遍历不可枚举的属性
- Object.getOwnPropertyNames 可以获取对象自身的所有属性名组成的数组(包括不可枚举属性)
const ykx = {}
Object.defineProperty(ykx, "sex", {
value: "male",
//是否为枚举属性
enumerable: false
});
console.log(Object.getOwnPropertyNames(ykx)) // ['sex']
但是不能获取Symbol值作为名称的属性
const a = Symbol()
const obj = {
[a]: 1
}
console.log(Object.getOwnPropertyNames(obj)) // []
- 最终方案 Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj)).length 或者 Reflect.ownKeys
const a = Symbol()
const obj1 = {
[a]: 1
}
const obj2 = {b:2}
const obj3={}
Object.defineProperty(obj3, 'ddd', {
value: 111,
enumerable: false
})
const obj4 = {}
function getLength(obj){
return Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj)).length
}
console.log(getLength(obj1)) // 1
console.log(getLength(obj2)) // 1
console.log(getLength(obj3)) // 1
console.log(getLength(obj4)) // 0
console.log(Reflect.ownKeys(obj1).length)// 1
console.log(Reflect.ownKeys(obj2).length)// 1
console.log(Reflect.ownKeys(obj3).length)// 1
console.log(Reflect.ownKeys(obj4).length)// 0
网友评论