Як визначити, чи має об’єкт задану властивість у 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" не суперечило б процесу перевірки;)
кенгакс

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

Підкреслити.js або Лодаш

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'))or(x && 'y' in x)
gnarf

Я згоден, тестування на x має бути окремим випадком самостійно. Також покращує звітність про помилки.
b01

Це не вдалося для мене. Якщо x не визначено, тоді typeof (xy) повертає, ReferenceErrorа не рядок 'undefined'
Крейг

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.