Как проверить, есть ли у объекта какие-либо свойства в JavaScript?

Предполагая, что я объявляю

var ad = {}; 

Как проверить, будет ли этот объект содержать какие-либо пользовательские свойства?

Ответы

Ответ 1

Вы можете перебрать свойства вашего объекта следующим образом:

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}

Важно использовать метод hasOwnProperty(), чтобы определить, имеет ли объект указанное свойство как прямое свойство и не унаследован от цепочки прототипов объекта.

редактировать

Из комментариев: вы можете поместить этот код в функцию и заставить его возвращать false, как только он достигнет той части, где есть комментарий

Тест производительности

Test Of Object.Keys vs For..In При тестировании любых свойств

Ответ 2

Вы можете использовать встроенный метод Object.keys, чтобы получить список ключей на объекте и проверить его длину.

var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values

if(Object.keys(x).length > 0){
 // Your code here if x has some properties  
}

Ответ 3

Как сделать простую функцию?

function isEmptyObject(obj) {
  for(var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
      return false;
    }
  }
  return true;
}

isEmptyObject({}); // true
isEmptyObject({foo:'bar'});  // false

Вызов метода hasOwnProperty непосредственно на Object.prototype заключается только в том, чтобы добавить немного больше безопасности, представьте себе следующее, используя обычный вызов obj.hasOwnProperty(...):

isEmptyObject({hasOwnProperty:'boom'});  // false

Примечание: (для будущего) Вышеупомянутый метод опирается на оператор for...in, и этот оператор выполняет итерацию только по перечислимым свойствам, в наиболее широко распространенной в настоящее время ECMAScript Standard (3-е издание) программист не имеет возможности создавать неперечислимые свойства.

Однако теперь это изменилось с ECMAScript 5th Edition, и мы можем создавать неперечислимые, незаписываемые или не подлежащие удалению свойства, поэтому приведенный выше метод может выйти из строя, например:

var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal', 
  enumerable: false,
  writable: true,
  configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!

Решение этой проблемы ECMAScript 5 будет:

function isEmptyObject(obj) {
  return Object.getOwnPropertyNames(obj).length === 0;
}

Метод Object.getOwnPropertyNames возвращает Array, содержащий имена всех собственных свойств объекта, перечисляемых или нет, этот метод теперь реализуется поставщиками браузеров, уже на бета-версии Chrome 5 и последней версии WebKit Ночные сборки.

Object.defineProperty также доступен в этих браузерах и последних версиях Firefox 3.7 Alpha.

Ответ 4

С помощью jQuery вы можете использовать:

$.isEmptyObject(obj); // Returns: Boolean

В jQuery 1.4 этот метод проверяет оба свойства самого объекта и свойства, унаследованные от прототипов (в том, что он не использует hasOwnProperty).

С ECMAScript 5th Edition в современных браузерах (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) вы можете использовать встроенный Object.keys метод:

var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;

Или простой старый JavaScript:

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

Ответ 5

В последних браузерах (и node.js) поддерживается Object.keys(), который возвращает массив со всеми ключами в объектном литерале, чтобы вы могли сделать следующее:

var ad = {}; 
Object.keys(ad).length;//this will be 0 in this case

Поддержка браузера: Firefox 4, Chrome 5, Internet Explorer 9, Opera 12, Safari 5

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

Ответ 6

Если вы используете underscore.js, вы можете использовать функцию _. isEmpty:

var obj = {};
var emptyObject = _.isEmpty(obj);

Ответ 7

Если вы хотите использовать lodash, вы можете использовать метод some.

_.some(obj) // returns true or false

См. этот небольшой jsbin пример

Ответ 8

for (var hasProperties in ad) break;
if (hasProperties)
    ... // ad has properties

Если вам нужно быть в безопасности и проверить прототипы объектов (они добавляются некоторыми библиотеками, а не там по умолчанию):

var hasProperties = false;
for (var x in ad) {
    if (ad.hasOwnProperty(x)) {
        hasProperties = true;
        break;
    }
}
if (hasProperties)
    ... // ad has properties

Ответ 9

for(var memberName in ad)
{
  //Member Name: memberName
  //Member Value: ad[memberName]
}

Член означает свойство члена, переменную-член, все, что вы хотите назвать > _ >

Вышеприведенный код вернет ВСЕ, в том числе toString... Если вы хотите узнать, был ли расширен прототип объекта:

var dummyObj = {};  
for(var memberName in ad)
{
  if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
  //Member Name: memberName
  //Member Value: ad[memberName]

}

Примечание A: Мы проверяем, имеет ли элемент фиктивного объекта тот же тип, что и наш член тестируемого объекта. Если это расширение, тип элемента dummyobject должен быть "undefined"

Ответ 10

Есть два способа сделать это:

  • propName в obj
  • obj.hasOwnProperty(PROPNAME)

Однако обратите внимание: между ними существует очень большая разница:

Первый возвращает true, если obj имеет свойство с именем propName (obj.propName), но если он не найдет его, он будет держать в поисках propName с помощью prototype дерево. Если он найдет его там, выражение вернет true, иначе оно вернет false.

Второй пример будет проверять только сам объект без, проверяя его прототип (ы). Это очень похоже на повторение массива.

Пример:

function Obj(){
    this.a = undefined;
    this.b = null;
    this.c = false;
}

Obj.prototype = {
    d: true,
    e: true
};

var obj = new Obj();

И проверить это:

"a" in obj  // true
"e" in obj  // true

obj.hasOwnProperty("a")  // true
obj.hasOwnProperty("e")  // false

Ответ 11

Если вы уверены, что объект является определяемым пользователем, самый простой способ определить, является ли UDO пустым, будет следующий код:

isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};

Несмотря на то, что этот метод (по своей природе) является дедуктивным, - это самый быстрый и быстрый.

a={};
isEmpty(a) >> true

a.b=1
isEmpty(a) >> false 

p.s.: ! не используйте его в определенных браузером объектах.

Ответ 12

Поздний ответ, но некоторые структуры обрабатывают объекты как перечисляемые. Поэтому bob.js может сделать это вот так:

var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();

Ответ 13

var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist

Простой, работает в каждом браузере, и хотя он технически представляет собой цикл для всех ключей на объекте, он выполняет НЕ цикл через все их... либо там 0, и цикл не запускается или есть некоторые, и он ломается после первого (потому что все, что мы проверяем, есть, если есть ЛЮБОЙ... так зачем продолжать?)

Ответ 14

Вы можете использовать следующее:

Двойной удар! поиск свойств

var a = !![]; // true
var a = !!null; // false

hasOwnProperty Это то, что я использовал:

var myObject = {
  name: 'John',
  address: null
};
if (myObject.hasOwnProperty('address')) { // true
  // do something if it exists.
}

Однако JavaScript решил не защищать имя метода, поэтому его можно было подделать.

var myObject = {
  hasOwnProperty: 'I will populate it myself!'
};

prop в myObject

var myObject = {
  name: 'John',
  address: null,
  developer: false
};
'developer' in myObject; // true, remember it looking for exists, not value.

TypeOf

if (typeof myObject.name !== 'undefined') {
  // do something
}

Однако он не проверяет значение null.

Я думаю, что это лучший способ.

в операторе

var myObject = {
  name: 'John',
  address: null
};

if('name' in myObject) {
  console.log("Name exists in myObject");
}else{
  console.log("Name does not exist in myObject");
}

результат:

Имя существует в myObject

Вот ссылка, которая более подробно описывает оператор in: Определение наличия свойства объекта

Ответ 15

Я написал 2 компонента с открытым исходным кодом, которые могут быть полезны для этого. Если вы хотите проверить, имеет ли объект определенную пользовательскую оперу, вы можете использовать этот объект - hasOwnPropert. Примеры:

hasOwnProperty({foo: 'bar'}, 'foo') // => true
hasOwnProperty({foo: 'bar'}, 'bar') // => false

Чтобы проверить, имеет ли объект какие-либо свойства (то есть, он пуст), вы можете использовать этот объект-пустой компонент.

Примеры:

empty([]) // => true
empty({}) // => true
empty(1) // => false
empty('') // => false
empty('foo') // => true

Надеюсь, что это поможет.

Ответ 16

Ответ очень поздний, но вот как вы могли бы справиться с прототипами.

Array.prototype.Any = function(func) {
    return this.some(func || function(x) { return x });
}

Object.prototype.IsAny = function() {
    return Object.keys(this).Any();
}