Відповіді:
Якщо ви тестуєте властивості, що знаходяться на самому об'єкті (не є частиною ланцюга прототипу), ви можете використовувати .hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
Ви можете скористатися in
оператором для тестування властивостей, які також успадковані.
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
.
Якщо ви хочете знати, чи об'єкт фізично містить відповідь властивості @ 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
Підкреслити.js або Лодаш
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
. Для масивів я думаю , що ви , можливо , захочете Array.prototype.indexOf
, _.indexOf
або_.contains
Одна особливість мого оригінального коду
if ( typeof(x.y) != 'undefined' ) ...
що може бути корисним у деяких ситуаціях - це безпечне використання, x
існує чи ні. З будь-яким із методів у відповіді gnarf слід спочатку перевіритиx
чи є сумніви, чи існує.
Тож, мабуть, усі три методи мають місце в сумці хитрощів.
(x && x.hasOwnProperty('y'))
or(x && 'y' in x)
ReferenceError
а не рядок 'undefined'
Оскільки питання стосувалося незрозумілості перевірки властивостей і однією регулярною справою використання для перевірки об'єктів параметрів аргументів функції, я подумав, що я згадаю короткий бібліотечний спосіб тестування існування декількох властивостей. Відмова від відповідальності: для цього потрібен 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
Чому б не просто:
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
Або якщо ви очікуєте конкретного типу:
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
x.hasOwnProperty('y')
?
Object.prototype.hasOwnProperty.call(x, 'y')
щоб властивість під назвою "hasOwnProperty" не суперечило б процесу перевірки;)