Как определить, имеет ли объект заданное свойство в JavaScript

Как определить, имеет ли объект x определенное свойство y, независимо от значения x.y?

В настоящее время я использую

if (typeof(x.y) !== 'undefined')

но это кажется немного неуклюжим. Есть ли лучший способ?

Ответ 1

Объект имеет свойство:

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

if (x.hasOwnProperty('y')) { 
  // ......
}

Объект или его прототип обладает свойством:

Вы можете использовать оператор in для проверки свойств, которые также наследуются.

if ('y' in x) {
  // ......
}

Ответ 2

Если вы хотите узнать, физически ли объект содержит свойство @gnarf, используя hasOwnProperty, он выполнит эту работу.

Если вы хотите знать, существует ли свойство где угодно, либо на самом объекте, либо в цепочке прототипов, вы можете использовать in.

if ('prop' in obj) {
  // ...
}

Например:.

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically

Ответ 3

Вы можете обрезать это примерно так:

if ( x.y !== undefined ) ...

Ответ 4

Underscore.js или Lodash

if (_.has(x, "y")) ...

:)

Ответ 5

Одна особенность моего исходного кода

if ( typeof(x.y) != 'undefined' ) ...

который может быть полезен в некоторых ситуациях, заключается в том, что безопасно использовать ли x или нет. С любым из методов в ответе gnarf следует сначала проверить x, если есть какие-либо сомнения в том, существует ли он.

Итак, возможно, все три метода имеют место в одном мешке трюков.

Ответ 6

Вот как я написал этот объект-hasOwnProperty повторно используемый компонент, чтобы проверить, имеет ли объект spesifice dproperty, возвращая логическое значение:

function hasOwnProperty(obj: {}, prop: string|number): boolean {
  return Object.prototype.hasOwnProperty.call(obj, prop);
};

Это не соответствует цепочке прототипов, и здесь приведены примеры:

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

Также добавлено 3 теста, чтобы показать, как он обрабатывает разные варианты использования (имеет значение, не имеет значения, равно null)

Ответ 7

Поскольку вопрос касался неуклюжести проверки свойств и одной регулярной утилиты для проверки правильности объектов опций аргументов функции, подумал, что я бы назвал бесплатный доступ к библиотеке для проверки наличия нескольких свойств. Отказ от ответственности: для этого требуется ECMAScript 5 (но IMO, все еще использующие IE8, заслуживает сломанной сети).

function f(opts) {
  if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
      throw new Error("IllegalArgumentException");
  }
  alert("ok");
}
f({req1: 123});  // error
f({req1: 123, req2: 456});  // ok

Ответ 8

Почему бы просто:

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

Или, если вы ожидаете определенного типа:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");