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


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

    Object.keys()

    通过 Object.keys() 来获取对象的键进行判断。

    function isEmpty(obj) {
      return Object.keys(obj).length === 0;
    }
    
    console.log(isEmpty({})); // true
    console.log(isEmpty({ a: 1 })); // false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    缺点:只能获取可枚举的字符串键。(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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    JSON.stringify()

    通过 JSON.stringify() 来将对象序列化为字符串进行判断。

    function isEmpty(obj) {
      return JSON.stringify(obj) === '{}';
    }
    
    console.log(isEmpty({})); // true
    console.log(isEmpty({ a: 1 })); // false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    缺点:以 undefined、函数作为值,以 symbol 作为键或值都不能被序列化。(MDN官网说明

    const obj = {
      a: undefined,
      b: function () { },
      c: Symbol(),
      [Symbol()]: 1
    }
    
    console.log(isEmpty(obj)); // true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    缺点:只能遍历可枚举属性。(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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    完美解决!!!但相对复杂。

    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));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    完美解决!!!且简单。

  • 相关阅读:
    10.1作业
    面向对象编程
    权限详解
    【机器学习合集】优化目标与评估指标合集 ->(个人学习记录笔记)
    一种数字全息自动聚焦技术研究及实例分析
    InnoDB存储引擎非常重要的一个机制--MVCC(多版本并发控制)
    数据分析第十三讲:数据可视化入门(二)
    100天精通Python(数据分析篇)——第49天:初识numpy模块
    大学宿舍IP一键视频对讲
    首届国际蜂业展在穗举办 零数科技受邀出席
  • 原文地址:https://blog.csdn.net/Jackson_Mseven/article/details/133895959