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

311

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

Я сейчас пользуюсь

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

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

royhowie
источник

Ответы:

584

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

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

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

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

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

if ('y' in x) {
  // ......
}
gnarf
источник
23
Или еще лучше - Object.prototype.hasOwnProperty.call(x, 'y')чтобы свойство с именем hasOwnProperty не конфликтовало с процессом проверки;)
kangax
4
Или даже короче {}.hasOwnProperty.call(x, 'y').
axmrnv
78

Если вы хотите знать, содержит ли объект физически ответ свойства @ 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
CMS
источник
18

Underscore.js или Lodash

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

:)

nackjicholson
источник
Нет. Это просто псевдоним для Object.prototype.hasOwnProperty.call(x, "y"). Для массивов я думаю , что вы , возможно , захотите Array.prototype.indexOf, _.indexOfили_.contains
nackjicholson
13

Вы можете уточнить это немного так:

if ( x.y !== undefined ) ...
jpsimons
источник
15
Это потерпит неудачу сx = {y:undefined}
Джеймс
20
Кто-нибудь должен различать «не определено» и «определено, чтобы быть неопределенным?»
jpsimons
16
@ darkporter я делаю иногда;)
ммм
6

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

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

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

Так что, возможно, все три метода имеют место в сумке с трюками.


источник
Вы всегда можете использовать (x && x.hasOwnProperty('y'))или(x && 'y' in x)
gnarf
Я согласен, тестирование на х должно быть отдельным делом само по себе. Также дает лучшее сообщение об ошибках.
b01
Это не удалось для меня. Если x не определено, тогда typeof (xy) возвращает ReferenceErrorвместо строки «undefined»
Craig
1

Так как вопрос касался грубости проверки свойств и одного регулярного варианта использования для проверки объектов опций аргумента функции, я подумал, что я бы упомянул о свободном от библиотеки коротком способе проверки существования нескольких свойств. Отказ от ответственности: для этого требуется 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
STT
источник
-2

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

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

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

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
купол
источник
1
Потому что его плохо читать, а не строгий тип. Я должен спросить вас: почему бы не просто x.hasOwnProperty('y')?
Фабиан Пикон