Как правильно проверить в JavaScript, является ли объект пустым, или содержит какие-то свойства?
Asked
Active
Viewed 1.3e+01k times
14
-
Что значит "пустой"? – Oct 01 '15 at 07:12
-
var object = {} – Robert Key Oct 01 '15 at 07:14
-
@IonDen спасибо за правки ) – Robert Key Oct 01 '15 at 08:50
-
1Загляните в библиотеку lodash, функция _.isEmpty. А вот как она реализована – Total Pusher Jun 12 '18 at 08:09
5 Answers
34
Например так:
if (Object.keys(obj).length == 0) {
console.log('пуст');
}
Но к сожелению, Object.keys() доступен не везде (нужно отметить галочку Show obsolete browsers? для того, чтобы увидеть все браузеры), поэтому можно воспользоваться полифилом, либо такой, например, функцией:
function isEmptyObject(obj) {
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
return false;
}
}
return true;
}
Либо так при помощи jQuery, если Вы не изменяли прототип Object:
if ($.isEmptyObject({});) {
console.log('пуст');
}
Rolandius
- 3,612
-
1У jQuery код в данном случае не впечатляет:
{for(var b in a)return!1;return!0}- если что-то было добавлено в прототип всех объектов, то ни один объект пустым не будет. – Qwertiy Oct 01 '15 at 07:21 -
-
1Спасибо за ответ , Object.keys(obj).length по моему лучший вариант. НО свойство keys() был добавлен в ECMAScript 5.1 , а до этого как можно было бы проверить? – Robert Key Oct 01 '15 at 07:33
-
@Rolandius http://stackoverflow.com/a/18913060/1988244 - может стоит дописать в ответ, хотя бы краткую версию? – Oct 01 '15 at 07:45
-
-
-
-
@Rolandius "Но к сожелению, Object.keys() доступен не везде" -- по вашей ссылке http://kangax.github.io/compat-table/es5/#Object.keys написано, что везде =) – dzhioev Oct 01 '15 at 10:50
-
@dzhioev, там надо выставить галочку на Show obsolete browsers? для того, чтобы видеть старые браузеры (допишу в ответе). Увы, красивей и читабельней сравнительных таблиц поддержки я еще не видел... – Rolandius Oct 01 '15 at 10:57
-
2@Rolandius, если объект имеет много полей, то
isEmptyObjectбудет работать очень уж не эффективно. Не проще ли возвращатьfalseсразу же, как только у объекта найдено первое собственное свойство? – Dmitriy Simushev Oct 01 '15 at 11:41 -
0
Переделал код из ответа @Роландиуса:
Object.prototype.isEmpty = function() {
for(let i in this) if (this.hasOwnProperty(i)) return false;
return true;
}
Чтобы вызывать у любого объета:
{a: {b: "c"}}.isEmpty()
или:
["a", "b", "c"].isEmpty()
-
{a: {b: "c"}}.isEmpty()- ошибкаUncaught SyntaxError: expected expression, got '.'– Jean-Claude Oct 17 '21 at 09:59
0
Как вариант:
if(!JSON.stringify({a:7})=='{}'){
console.log('Не пуст')
}
Или проверить наличие третьего символа в строке, пустой объект-строка всегда имеет 2 символа.
if(JSON.stringify({a:7})[2]){
console.log('Не пуст')
}
Teamur
- 9
-
3
-
Ну и вариант этот тоже не очень сам по себе т.к. там могут быть пробелы и табуляции или же так называемые рыбы. – Jun 12 '18 at 07:38
-
Duoxx,точно! Но это для тех, кто привык не ставить пробелы изначально. Пусть будет так ) – Teamur Jun 12 '18 at 07:41
-
По-моему JSON.stringify доступен везде. И мы, т.о., получаем самое короткое выражение (я про второе исполнение), верно? Но обращение [2] может запутать – Teamur Jun 12 '18 at 08:01
-
Ваш подход напоминает мне использование
if (String(var).length == "5")вместоif (!var). Зачем переводить объект в строковое представление, если можно просто спросить его о наличии полей, как сделал Rolandius? – Arhadthedev Jun 12 '18 at 08:11 -
Arhad, спасибо! Вариант Rolandius будет быстрее из-за отсутствия преобразований? – Teamur Jun 12 '18 at 08:15
-
Да. Если Rolandius пробегает только по самому объекту, останавливаясь на первом полноценном атрибуте, то
stringifyобрабатывает весь объект, рекурсивно переходя по каждому объектному атрибуту. – Arhadthedev Jun 12 '18 at 08:19 -
0
Как вариант можно вот так
function isEmpty(obj) {
for(var key in obj)
{
return false;
}
return true;
}