¿Cómo verificar si la propiedad del objeto existe con una variable que contiene el nombre de la propiedad?

680

Estoy verificando la existencia de una propiedad de objeto con una variable que contenga el nombre de la propiedad en cuestión.

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

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

Esto se undefineddebe a que está buscando myObj.myProppero quiero que verifiquemyObj.prop

Slopeside Creative
fuente
2
Posiblemente útil: de un comentario de Pablo Cabrera en NCZOnline : "Creo que vale la pena señalar que si hasOwnPropertyse sobrescribe el método, puede confiar en el Object.prototype.hasOwnProperty.call(object, property)".
HumanInDisguise
10
¿ stackoverflow.com/questions/4244896/… es un duplicado de esta pregunta? ¿como es eso? ¿'comprobar la existencia' y 'acceder al valor' son cosas diferentes? Por favor, corríjanme si me equivoco ....
adnan2nd
Esto no es un duplicado.
Jeff Clayton

Respuestas:

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

O

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

O

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

Tenga en cuenta que hasOwnPropertyno verifica las propiedades heredadas, mientras que insí. Por ejemplo 'constructor' in myObjes cierto, pero myObj.hasOwnProperty('constructor')no lo es.

Cohete Hazmat
fuente
23
hasOwnProperty()es mejor que myObj[myProp](de otras respuestas) ya que funciona incluso si el valor de myPropes 0
Matt R
99
El operador "in" no funciona con cadenas. por ejemplo, 'length' en 'qqq' producirá una excepción. Entonces, si desea una verificación de propósito general, debe usar hasOwnProperty.
Jacob
1
@Jacob, ¿qué quieres decir cuando dices 'El operador "in" no funciona con cadenas "? con el operador "in", la expresión izquierda debe ser una cadena o valor que se pueda convertir en una cadena. Sí, no puede escribir 'length' en 'qqq' pero tampoco puede escribir 'qqq'.hasOwnProperty (' length ') tampoco
Wachburn
2
@Wachburn: 'qqq'.hasOwnProperty('length')es decir true, puedes hacer eso.
Rocket Hazmat
1
@ gaurav5430 Creo que a lo que me refiero es que si myPropes 0, la declaración if se vería como if (myObj[0])if si myObjtiene alguna propiedad, la expresión se evaluaría true. Y myObj[0]puede que no sea la propiedad que está buscando.
Matt R
51

Puede usar hasOwnProperty , pero según la referencia, necesita comillas cuando usa este método:

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

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

Otra forma es usarlo en el operador, pero también necesita citas aquí:

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

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

Adorjan Princz
fuente
66
Es decir , no cómo hasOwnProperty()se implementa.
Canon
77
Esto es incorrecto. Al poner comillas alrededor del nombre myProp, ya no hace referencia al valor de myProp, sino que declara una nueva Cadena () de 'myProp' y no existe tal propiedad de 'myProp' en myObj.
TriumphST
1
TriumpST: del MDN vinculado anteriormente, "prop: una cadena o símbolo que representa un nombre de propiedad o índice de matriz (los no símbolos se convertirán en cadenas)".
Ben Creasy
Esto es correcto. Si no desea utilizar una variable, pero solo si está presente un 'myProp' específico, necesita las comillas.
Katinka Hesselink
@KatinkaHesselink: su comentario es engañoso. La pregunta era "¿Cómo verificar si la propiedad del objeto existe con una variable que contiene el nombre de la propiedad?"
Herbert Van-Vliet
26

Gracias por la ayuda de todos y presionando para deshacerse de la declaración eval. Las variables deben estar entre paréntesis, no con notación de puntos. Esto funciona y es un código limpio y adecuado.

Cada una de estas son variables: appChoice, underI, underObstr.

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}
Slopeside Creative
fuente
Esto me parece un problema. Si tData.tonicdata[appChoice]da como resultado un valor que no tiene una propiedad / índice que coincida underI, entonces esto resultará en un TypeErrorlanzamiento.
No
A pesar de sus intenciones con su publicación inicial, en realidad hizo una pregunta diferente a la que proporcionó esta respuesta. Querías comprobar la existencia de una propiedad, no mencionas nada sobre cómo acceder a ella. Lo que hace que esta respuesta no esté relacionada con la pregunta real.
Forraje
18

Para propiedad propia:

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

Nota: usar Object.prototype.hasOwnProperty es mejor que loan.hasOwnProperty (..), en caso de que un hasOwnProperty personalizado se defina en la cadena de prototipos (que no es el caso aquí), 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 propiedades heredadas en el hallazgo, use el operador in : (pero debe colocar un objeto en el lado derecho de 'in', los valores primitivos arrojarán un error, por ejemplo, 'length' en 'home' arrojará un error, pero 'length' en la nueva cadena ('casa') no)

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: Uno puede verse tentado a usar typeof y [] el descriptor de acceso de propiedad como el siguiente código que no siempre funciona ...

var loan = { amount: 150 };

loan.installment = undefined;

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

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

Una forma mucho más segura de verificar si existe una propiedad en el objeto es usar un objeto vacío o un prototipo de objeto para llamar 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

Referencia de MDN Web Docs - Object.prototype.hasOwnProperty ()

skmasq
fuente
44
Si está incorporando JavaScript que podría hacer algo malo como anular hasOwnProperty, ninguna cantidad de guardias como este hará que su código sea seguro.
meustrus
@meustrus Sé de dónde vienes, pero desde una perspectiva comercial es muy posible recibir que un desarrollador inexperto use este nombre de propiedad, lo que no necesariamente significa que están haciendo algo mal intencionalmente.
skmasq
4

Puede usar hasOwnProperty()tan bien como inoperador.

Simran Kaur
fuente
Todo esto ^ es por qué odio javascript
pwaterz
1
@pwaterz no odies al jugador 🙄
ArchNoob
Jaja, me encanta :)
pwaterz