Как проверить, существует ли свойство объекта с переменной, содержащей имя свойства?

Я проверяю существование свойства объекта с переменной, содержащей указанное имя свойства.

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

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

Это undefined, потому что он ищет myObj.myProp, но я хочу, чтобы он проверял myObj.prop

Ответ 1

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

Или же

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

Или же

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

Обратите внимание, что hasOwnProperty не проверяет унаследованные свойства, тогда как in делает. Например, 'constructor' in myObj - это истина, а myObj.hasOwnProperty('constructor') - нет.

Ответ 2

Вы можете использовать hasOwnProperty, но на основе ссылки вам нужно кавычки при использовании этого метода:

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

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

Другой способ - использовать в, но вам нужны кавычки:

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

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

Ответ 3

Спасибо вам за помощь и стремление избавиться от заявления eval. Переменные должны быть в скобках, а не в виде точечной нотации. Это работает и является чистым, правильным кодом.

Каждая из этих переменных: appChoice, underI, underObstr.

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

Ответ 4

Для собственного имущества:

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

Примечание: использование Object.prototype.hasOwnProperty лучше, чем loan.hasOwnProperty(..), в случае, если в цепочке прототипов определен пользовательский hasOwnProperty (что здесь не так), например

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

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

Чтобы включить в поиск унаследованные свойства, используйте оператор в: (но вы должны поместить объект справа от 'in', примитивные значения приведут к ошибке, например, 'length' в 'home выдаст ошибку, но "длина" в новой строке ("home") не будет)

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

Примечание. Может возникнуть соблазн использовать аксессор свойств typeof и [] в качестве следующего кода, который не всегда работает...

var loan = { amount: 150 };

loan.installment = undefined;

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

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

Ответ 5

Более безопасный способ проверить, существует ли свойство объекта, использовать пустой объект или прототип объекта для вызова hasOwnProperty()

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

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

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

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

Ссылка из MDN Web Docs - Object.prototype.hasOwnProperty()

Ответ 6

Вы можете использовать hasOwnProperty(), а также оператор in.

Ответ 7

Вы также можете использовать этот компонент object-hasOwnProperty, который я написал, чтобы избежать копирования в разные места. Его можно использовать для определения того, имеет ли объект указанное свойство.

Примеры:

hasOwnProperty({foo: 'bar'}, 'foo') // => true
hasOwnProperty({foo: 'bar'}, 'bar') // => false

Как это работает:

function hasOwnProperty(obj: {}, prop: string|number): boolean {
  return Object.prototype.hasOwnProperty.call(obj, prop);
};

Ответ 8

а что? !!myObject['myProp'] работает для меня.

Ответ 9

if(myObj[myProp])
{

   `enter code here`

}