为什么所有属性均未定义的对象未列为空?

时间:2019-02-04 16:42:24

标签: javascript node.js

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

const a = {};

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

示例:

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

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

2 个答案:

答案 0 :(得分:3)

您的对象a 不是为空,它具有2个定义的属性,bc,其值为undefined

您在评论之一中说:

  

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

但事实是,这些属性没有“没有值”,它们的值是undefinedundefined是一个非常有效的值,就像null""(空字符串)和NaN一样。

答案 1 :(得分:1)

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

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

console.log(Object.keys(a).length); // 2

下划线文档

  

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

Lodash文档

  

检查value是否为空对象,集合,地图或集合。

     

如果对象没有自己的可枚举字符串键属性,则认为它们为空。

     

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

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

https://developer.android.com/training/scheduling/wakelock