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


311

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

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

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

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

Ответы:


584

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

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

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

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

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

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

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

18

Underscore.js или Lodash

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

:)


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

13

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

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

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

-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')?
Фабиан Пикон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.