С Lodash и Underscore я могу знать, пуст ли объект.
const a = {};
Я хочу понять, почему он не распознает как пустой объект, где все его свойства не определены.
Пример:
const a = {
b: undefined,
c: undefined
};
Этот вопрос не является дубликатом lodash: объект проверки пуст: я не ищу метод для проверки, если он пуст с неопределенными свойствами, я хочу понять, почему даже со свойствами неопределенного значения это не пустой объект.
Ваш объект a
не пустой, он имеет 2 свойства, определенные для него, b
и c
и их значения не undefined
.
Вы говорите в одном из ваших комментариев:
Я прекрасно понимаю, что если у него есть свойства, но если его свойства не имеют значения, почему бы не сказать, что объект пуст.
Но дело в том, что эти свойства не "не имеют значения", они имеют значение undefined
. undefined
- совершенно правильное значение, такое же как null
, ""
(пустая строка) и NaN
.
Ответ на ваш вопрос содержится в документах, на которые вы ссылаетесь. Если функции вызываются для объектов, они проверяют длину. Если длина> 0, объект не считается пустым.
const a = {
b: undefined,
c: undefined
};
console.log(Object.keys(a).length); // 2
Подчеркни Документы
Возвращает true, если перечислимый объект не содержит значений (не перечислимых собственных свойств). Для строк и массивоподобных объектов _.isEmpty проверяет, имеет ли свойство length значение 0.
Lodash Docs
Проверяет, является ли значение пустым объектом, коллекцией, картой или набором.
Объекты считаются пустыми, если у них нет собственных перечисляемых строковых ключевых свойств.
Подобные массиву значения, такие как объекты аргументов, массивы, буферы, строки или jQuery-подобные коллекции, считаются пустыми, если они имеют длину 0. Аналогично, карты и наборы считаются пустыми, если они имеют размер 0.
Для этого представьте картотеку, представляющую ваш объект. Хотя ящики могут не содержать ничего, физически шкаф все же содержит три ящика. В зависимости от контекста, в котором вы используете _.isEmpty()
, это может быть или не быть важной частью информации.
Object.keys(obj).length > 0
считался пустым: это не так.