Ответы:
Если вы тестируете свойства, которые находятся на самом объекте (а не в его цепочке прототипов), вы можете использовать .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
Underscore.js или Lodash
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'))
или(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 не конфликтовало с процессом проверки;)