Como verificar se a propriedade do objeto existe com uma variável que contém o nome da propriedade?


680

Estou verificando a existência de uma propriedade de objeto com uma variável que contém o nome da propriedade em questão.

var myObj;
myObj.prop = "exists";
var myProp = "p"+"r"+"o"+"p";

if(myObj.myProp){
    alert("yes, i have that property");
};

Isso ocorre undefinedporque ele está procurando, myObj.myPropmas eu quero que ele verifiquemyObj.prop


2
Possivelmente útil: a partir de um comentário de Pablo Cabrera no NCZOnline : "Acho que vale a pena notar que, se o hasOwnPropertymétodo for sobrescrito, você poderá confiar no Object.prototype.hasOwnProperty.call(object, property)."
HumanInDisguise

10
stackoverflow.com/questions/4244896/… é uma duplicata desta pergunta? como é isso? 'verificar existência' e 'acessar valor' são coisas diferentes? Por favor me corrijam se eu estiver errado ....
adnan2nd

isso não é uma duplicata.
Jeff Clayton

Respostas:


1307
var myProp = 'prop';
if(myObj.hasOwnProperty(myProp)){
    alert("yes, i have that property");
}

Ou

var myProp = 'prop';
if(myProp in myObj){
    alert("yes, i have that property");
}

Ou

if('prop' in myObj){
    alert("yes, i have that property");
}

Observe que hasOwnPropertynão verifica propriedades herdadas, ao contrário in. Por exemplo, 'constructor' in myObjé verdade, masmyObj.hasOwnProperty('constructor') não é.


23
hasOwnProperty()é melhor então myObj[myProp](de outras respostas), pois funciona mesmo que o valor de myPropseja 0
Matt R

9
O operador "in" não funciona com cadeias de caracteres. por exemplo, 'length' em 'qqq' produzirá uma exceção. Portanto, se você deseja uma verificação de uso geral, precisa usar o hasOwnProperty.
19243 Jacob

1
@ Jacob: o que você quer dizer quando diz 'O operador "in" não funciona com strings "? com o operador "in" ', a expressão esquerda deve ser uma sequência ou um valor que possa ser convertido em uma sequência. Sim, você não pode escrever 'length' em 'qqq', mas você não pode escrever 'qqq'.hasOwnProperty (' tamanho ') quer
Wachburn

2
@ Wachburn: 'qqq'.hasOwnProperty('length')é true, você pode fazer isso.
Rocket Hazmat

1
@ gaurav5430 Acredito que estou me referindo a que, se myPropfor 0, a instrução if seria semelhante a if (myObj[0])qual se myObjpossui alguma propriedade, a expressão seria avaliada como true. E myObj[0]pode não ser a propriedade que você está procurando.
Matt R

51

Você pode usar o hasOwnProperty , mas com base na referência, você precisa de aspas ao usar este método:

if (myObj.hasOwnProperty('myProp')) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Outra maneira é usar no operador, mas você também precisa de aspas aqui:

if ('myProp' in myObj) {
    // do something
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in


6
Isso é não como hasOwnProperty()é implementado.
canon

7
Isto está incorreto. Ao colocar aspas em torno do nome myProp, você não está mais fazendo referência ao valor de myProp, mas está declarando uma nova String () de 'myProp' e não existe essa propriedade de 'myProp' em myObj.
TriumphST

1
TriumpST: do MDN vinculado acima, "prop - Uma string ou símbolo representando um nome de propriedade ou índice de matriz (os não símbolos serão coagidos a strings)."
Ben Creasy

Isto está correto. Se você não quiser usar uma variável, mas apenas se um 'myProp' específico estiver presente, você precisará das aspas.
21418 Katinka Hesselink #

@KatinkaHesselink: Seu comentário é enganador. A pergunta era "Como verificar se a propriedade do objeto existe com uma variável que contém o nome da propriedade?"
Herbert Van-Vliet

26

Obrigado pela ajuda e esforço de todos para se livrar da declaração de avaliação. Variáveis ​​precisam estar entre colchetes, não em notação de ponto. Isso funciona e é um código limpo e adequado.

Cada uma dessas variáveis ​​é: appChoice, underI, underObstr.

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}

Isso parece um problema para mim. Se tData.tonicdata[appChoice]resultar em um valor que não possui uma propriedade / índice que corresponda underI, isso resultará em um TypeErrorlançamento.
Ynot

Apesar de suas intenções com a postagem inicial, você realmente fez uma pergunta diferente daquela para a qual forneceu esta resposta. Você queria verificar a existência de uma propriedade, não menciona nada sobre como acessá-la. O que torna essa resposta não relacionada à pergunta real.
Forragem

18

Para propriedade própria:

var loan = { amount: 150 };
if(Object.prototype.hasOwnProperty.call(loan, "amount")) 
{ 
   //will execute
}

Nota: usar Object.prototype.hasOwnProperty é melhor que loan.hasOwnProperty (..), caso um hasOwnProperty personalizado seja definido na cadeia de protótipos (que não é o caso aqui), como

var foo = {
      hasOwnProperty: function() {
        return false;
      },
      bar: 'Here be dragons'
    };

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

Para incluir propriedades herdadas na descoberta, use o operador in : (mas você deve colocar um objeto no lado direito de 'in', valores primitivos gerarão erros; por exemplo, 'length' em 'home' gerará erros, mas 'length' na nova String ('home') não)

const yoshi = { skulk: true };
const hattori = { sneak: true };
const kuma = { creep: true };
if ("skulk" in yoshi) 
    console.log("Yoshi can skulk");

if (!("sneak" in yoshi)) 
    console.log("Yoshi cannot sneak");

if (!("creep" in yoshi)) 
    console.log("Yoshi cannot creep");

Object.setPrototypeOf(yoshi, hattori);

if ("sneak" in yoshi)
    console.log("Yoshi can now sneak");
if (!("creep" in hattori))
    console.log("Hattori cannot creep");

Object.setPrototypeOf(hattori, kuma);

if ("creep" in hattori)
    console.log("Hattori can now creep");
if ("creep" in yoshi)
    console.log("Yoshi can also creep");

// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in

Nota: Pode-se tentar usar typeof e [] property accessor como o código a seguir, que nem sempre funciona ...

var loan = { amount: 150 };

loan.installment = undefined;

if("installment" in loan) // correct
{
    // will execute
}

if(typeof loan["installment"] !== "undefined") // incorrect
{
    // will not execute
}

13

Uma maneira muito mais segura de verificar se existe propriedade no objeto é usar o objeto vazio ou o protótipo do objeto para chamar hasOwnProperty()

var foo = {
  hasOwnProperty: function() {
    return false;
  },
  bar: 'Here be dragons'
};

foo.hasOwnProperty('bar'); // always returns false

// Use another Object's hasOwnProperty and call it with 'this' set to foo
({}).hasOwnProperty.call(foo, 'bar'); // true

// It's also possible to use the hasOwnProperty property from the Object
// prototype for this purpose
Object.prototype.hasOwnProperty.call(foo, 'bar'); // true

Referência do MDN Web Docs - Object.prototype.hasOwnProperty ()


4
Se você estiver incorporando JavaScript que possa fazer algo errado, como substituir hasOwnProperty, nenhuma quantidade de guardas como essa tornará seu código seguro.
meustrus

@ meustrus Eu sei de onde você é, mas, do ponto de vista comercial, é altamente possível perceber que um desenvolvedor inexperiente usaria esse nome de propriedade, o que não significa necessariamente que eles estão fazendo algo mal intencionalmente.
skmasq 11/01/19

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.