• 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

    完美解决!!!且简单。

  • 相关阅读:
    计算机神经网络专业前景,计算机神经网络是什么
    一、vue介绍
    开心消消乐游戏网页设计作品 学生dreamweaver作业静态HTML网页设计模板 游戏主题网页作业制作
    『MySQL快速上手』-⑥-表的约束
    Android背景和音乐
    基于FPGA的图像缩小算法实现,包括tb测试文件和MATLAB辅助验证
    nth-child() +css3媒体查询中的device-width
    手机浏览器风生水起,多御安全浏览器手机版升级上线
    【python基础】if语句-语法格式
    python项目2to3方案预研
  • 原文地址:https://blog.csdn.net/Jackson_Mseven/article/details/133895959