Respostas:
Se você estiver testando propriedades que estão no próprio objeto (que não fazem parte de sua cadeia de protótipos), poderá usar .hasOwnProperty()
:
if (x.hasOwnProperty('y')) {
// ......
}
Você pode usar o in
operador para testar propriedades herdadas também.
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
.
Se você quiser saber se o objeto contém fisicamente a resposta da propriedade @ gnarf,hasOwnProperty
fará o trabalho.
Se você deseja saber se a propriedade existe em algum lugar, no próprio objeto ou na cadeia de protótipos, você pode usar o in
operador .
if ('prop' in obj) {
// ...
}
Por exemplo.:
var obj = {};
'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
Underscore.js ou Lodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
. Para arrays Eu acho que você pode querer Array.prototype.indexOf
, _.indexOf
ou_.contains
Você pode aparar isso um pouco assim:
if ( x.y !== undefined ) ...
x = {y:undefined}
Um recurso do meu código original
if ( typeof(x.y) != 'undefined' ) ...
o que pode ser útil em algumas situações é que é seguro usar se x
existe ou não. Com qualquer um dos métodos na resposta do gnarf, deve-se primeiro testar x
se há alguma dúvida se ele existe.
Portanto, talvez todos os três métodos tenham um lugar na mochila de truques.
(x && x.hasOwnProperty('y'))
or(x && 'y' in x)
ReferenceError
vez que a string 'indefinido'
Como a pergunta era sobre clunkiness da verificação de propriedades, e um caso regular para validar objetos de opções de argumentos de função, pensei em mencionar uma maneira curta e livre de biblioteca de testar a existência de várias propriedades. Exoneração de responsabilidade: Requer o ECMAScript 5 (mas o IMO que ainda estiver usando o IE8 merece uma web quebrada).
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
Por que não simplesmente:
if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");
Ou se você espera um tipo específico:
if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
x.hasOwnProperty('y')
?
Object.prototype.hasOwnProperty.call(x, 'y')
, de modo que propriedade chamada "hasOwnProperty" não seria conflito com processo de inspeção;)