JS如何判断对象为空?以及各自的缺点。
Object.keys()
通过 Object.keys()
来获取对象的键进行判断。
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
console.log(isEmpty({})); // true
console.log(isEmpty({ a: 1 })); // false
缺点:只能获取可枚举的字符串键。(MDN官网说明)
// 第一种:不可枚举字符串
const obj = {}
Object.defineProperty(obj, 'a', {
value: 1,
enumerable: false
})
console.log(obj); // { a: 1 }
console.log(isEmpty(obj)); // true
// 第二种:symbol
const obj = {
[Symbol()]: 1
}
console.log(obj); // true
JSON.stringify()
通过 JSON.stringify()
来将对象序列化为字符串进行判断。
function isEmpty(obj) {
return JSON.stringify(obj) === '{}';
}
console.log(isEmpty({})); // true
console.log(isEmpty({ a: 1 })); // false
缺点:以 undefined
、函数作为值,以 symbol
作为键或值都不能被序列化。(MDN官网说明)
const obj = {
a: undefined,
b: function () { },
c: Symbol(),
[Symbol()]: 1
}
console.log(isEmpty(obj)); // true
for...in
通过 for...in
直接遍历对象进行判断。
function isEmpty(obj) {
let flag = true;
for (let key in obj) {
flag = false;
break;
}
return flag;
}
console.log(isEmpty({})); // true
console.log(isEmpty({ a: 1 })); // false
缺点:只能遍历可枚举属性。(MDN官网说明)
// 第一种:不可枚举字符串
const obj = {}
Object.defineProperty(obj, 'a', {
value: 1,
enumerable: false
})
console.log(obj); // { a: 1 }
console.log(isEmpty(obj)); // true
// 第二种:symbol
const obj = {
[Symbol()]: 1
}
console.log(obj); // true
Object.getOwnPropertyNames()
结合 Object.getOwnPropertySymbols()
通过 Object.getOwnPropertyNames()
来获取对象的字符串键名以及 Object.getOwnPropertySymbols()
来获取对象的 symbol
键名进行判断。
function isEmpty(obj) {
return Object.getOwnPropertyNames(obj).length + Object.getOwnPropertySymbols(obj).length === 0;
}
console.log(isEmpty({})); // true
console.log(isEmpty({ a: 1 })); // false
const obj = {
[Symbol()]: 1
}
console.log(isEmpty(obj)); // false
完美解决!!!但相对复杂。
Reflect.ownKeys()
通过 Reflect.ownKeys()
来获取对象的键进行判断。
function isEmpty(obj) {
return Reflect.ownKeys(obj).length === 0;
}
console.log(isEmpty({}));
console.log(isEmpty({ a: 1 }));
const obj = {
[Symbol()]: 1
}
console.log(isEmpty(obj));
完美解决!!!且简单。