Как определить, имеет ли объект x
определенное свойство y
, независимо от значения x.y
?
В настоящее время я использую
if (typeof(x.y) !== 'undefined')
но это кажется немного неуклюжим. Есть ли лучший способ?
Как определить, имеет ли объект x
определенное свойство y
, независимо от значения x.y
?
В настоящее время я использую
if (typeof(x.y) !== 'undefined')
но это кажется немного неуклюжим. Есть ли лучший способ?
Если вы тестируете свойства, которые находятся на самом объекте (не являетесь частью его прототипной цепочки), вы можете использовать .hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
Вы можете использовать оператор in
для проверки свойств, которые также наследуются.
if ('y' in x) {
// ......
}
Если вы хотите узнать, физически ли объект содержит свойство @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
Вы можете обрезать это примерно так:
if ( x.y !== undefined ) ...
Underscore.js или Lodash
if (_.has(x, "y")) ...
:)
Одна особенность моего исходного кода
if ( typeof(x.y) != 'undefined' ) ...
который может быть полезен в некоторых ситуациях, заключается в том, что безопасно использовать ли x
или нет. С любым из методов в ответе gnarf следует сначала проверить x
, если есть какие-либо сомнения в том, существует ли он.
Итак, возможно, все три метода имеют место в одном мешке трюков.
Вот как я написал этот объект-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)
Поскольку вопрос касался неуклюжести проверки свойств и одной регулярной утилиты для проверки правильности объектов опций аргументов функции, подумал, что я бы назвал бесплатный доступ к библиотеке для проверки наличия нескольких свойств. Отказ от ответственности: для этого требуется 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!");