JS如何判断对象为空?以及各自的优缺点。

26 阅读1分钟

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));

完美解决!!!且简单。