【问题标题】:Why an object where all its properties are undefined is not listed as empty?为什么所有属性都未定义的对象未列为空?
【发布时间】:2026-02-12 10:05:02
【问题描述】:

使用LodashUnderscore 我可以知道一个对象是否为空。

const a = {};

我想了解的是为什么它不能将所有属性都未定义的对象识别为空。

例子:

const a = {
  b: undefined,
  c: undefined
};

这个问题不是lodash: check object is empty的重复:我不是在寻找一种方法来验证它是否为空且具有未定义的属性,我想了解为什么即使具有未定义值的属性它也不是空对象。

【问题讨论】:

  • 因为a不为空?
  • 我看不出有任何理由将 Object.keys(obj).length > 0 的对象视为空:它不是。
  • 因为它包含属性 - bc。它们的值只是未定义
  • 我完全理解,如果它有属性,但如果它的属性没有值,为什么不说对象是空的。
  • 因为undefined 是一个完全合法的值。

标签: javascript node.js


【解决方案1】:

您的对象a不是为空,它定义了两个属性bc,它们的值为undefined

你在你的一个 cmets 中说:

我完全理解,如果它有属性,但如果它的属性 没有价值,为什么不说对象是空的。

但问题是,这些属性并不是“没有价值”,它们的价值是undefinedundefined 是一个完全有效的值,就像 null""(空字符串)和 NaN

【讨论】:

    【解决方案2】:

    您的问题已在您链接的文档中得到解答。 如果在对象上调用函数,它们会检查长度。如果长度 > 0,则该对象不被认为是空的。

    const a = {
      b: undefined,
      c: undefined
    };
    
    console.log(Object.keys(a).length); // 2
    

    下划线文档

    如果可枚举对象不包含任何值(没有可枚举的自身属性),则返回 true。对于字符串和类似数组的对象,_.isEmpty 检查长度属性是否为 0。

    Lodash 文档

    检查 value 是否为空对象、集合、映射或集合。

    如果对象没有自己的可枚举字符串键属性,则将其视为空对象。

    类似数组的值,例如参数对象、数组、缓冲区、字符串或类似 jQuery 的集合,如果长度为 0,则视为空。类似地,如果映射和集合的大小为 0,则视为空。

    为此,想象一个文件柜代表您的对象。虽然抽屉中可能没有任何东西,但在物理上,橱柜仍然包含三个抽屉本身。根据您使用_.isEmpty() 的上下文,这可能是也可能不是重要信息。

    【讨论】:

      最近更新 更多