14

Как правильно проверить в JavaScript, является ли объект пустым, или содержит какие-то свойства?

5 Answers5

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
  • @Qwertiy, согласен, но метод есть как факт) Изменил немного ответ. – Rolandius Oct 01 '15 at 07:26
  • 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
  • @PashaPash, да-да, пишу сейчас) – Rolandius Oct 01 '15 at 07:52
  • @Riskey, дополнил ответ. – Rolandius Oct 01 '15 at 07:59
  • @Rolandius красава :) – Robert Key Oct 01 '15 at 08:09
  • @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
  • @DmitriySimushev, согласен, исправил. – Rolandius Oct 01 '15 at 11:44
0
const isEmpty= Object.keys(obj).length == 0;
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()
0xdb
  • 51,614
VectorASD
  • 1
  • 1
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:30
  • Ну и вариант этот тоже не очень сам по себе т.к. там могут быть пробелы и табуляции или же так называемые рыбы. –  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
  • Arhad, спасибо! Сами знаете, это стремление к коротким выражениям )) – Teamur Jun 12 '18 at 08:22
0

Как вариант можно вот так

function isEmpty(obj) {
    for(var key in obj)
    {
        return false;
    }
    return true;
}