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

javascript object

595245 просмотра

6 ответа

3573 Репутация автора

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

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

Автор: Slopeside Creative Источник Размещён: 14.06.2012 07:58

Ответы (6)


1196 плюса

179421 Репутация автора

Решение
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')это не так.

Автор: Rocket Hazmat Размещён: 14.06.2012 08:01

24 плюса

3573 Репутация автора

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

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

if(typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined"){
    //enter code here
}
Автор: Slopeside Creative Размещён: 15.06.2012 03:15

43 плюса

10338 Репутация автора

Вы можете использовать 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

Автор: Adorjan Princz Размещён: 10.05.2015 07:22

2 плюса

520 Репутация автора

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

Автор: Simran Kaur Размещён: 07.11.2015 03:38

10 плюса

2441 Репутация автора

Гораздо более безопасный способ проверить, существует ли свойство объекта, - использовать пустой объект или прототип объекта для вызова 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

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

Автор: skmasq Размещён: 25.07.2016 12:36

11 плюса

753 Репутация автора

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

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 : (но вы должны поместить объект справа от 'in', примитивные значения приведут к ошибке, например, 'length' в 'home' вызовет ошибку, но 'length' в новой строке («дом») не будет)

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
}
Автор: adnan2nd Размещён: 15.10.2017 12:57
Вопросы из категории :
32x32