Вопрос по javascript, object – Как проверить, существует ли свойство объекта с переменной, содержащей имя свойства? [Дубликат]

537

На этот вопрос уже есть ответ:

Динамический доступ к свойству объекта с помощью переменной 11 ответов

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

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

является / Stackoverflow.com вопросы / 4244896 / ... дубликат этого вопроса? Как так? «проверка существования» и «доступ к значению» - разные вещи? Пожалуйста, поправьте меня, если я ошибаюсь .... adnan2nd
Возможно полезно: из комментария Пабло Кабреры в NCZOnline: «Думаю, стоит отметить, что есhasOwnProperty метод перезаписан, вы можете положиться наObject.prototype.hasOwnProperty.call(object, property). " HumanInDisguise

Ваш Ответ

6   ответов
1056
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");
}
@ Крис:myProp является переменной.var myProp = "myProp"; if(myProp in myObj){} Rocket Hazmat
Оператор "in" не работает со строками. например 'length' в 'qqq' выдаст исключение. Так что, если вам нужна проверка общего назначения, вам нужно использовать hasOwnProperty. Jacob
hasOwnProperty() лучше, чемmyObj[myProp] (из других ответов), как это работает, даже если значениеmyProp равно 0 Matt R
myProp должен быть строкой или строковой переменной. Chad Kuehn
hasOwnProperty() предпочтительнее, если вы не хотите проверять унаследованные свойства. adamse
9

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

@ meustrus Я знаю, откуда вы, но с точки зрения бизнеса весьма вероятно, что неопытный разработчик будет использовать это имя свойства, что не обязательно означает, что они намеренно совершают что-то плохое. skmasq
Если вы используете JavaScript, который может сделать что-то плохое, например, переопределитьhasOwnProperty никакое количество таких охранников не сделает ваш код безопасны meustrus
1

hasOwnProperty() так же какin оператор.

24

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

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

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

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

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/hasOwnPropert

Чтобы включить унаследованные свойства в поиске, используйтеператор @: (но вы должны поместить объект справа от 'in', примитивные значения приведут к ошибке, например, "длина" в "доме" выдаст ошибку, но 'length' в новой строке ('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/i

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

var loan = { amount: 150 };

loan.installment = undefined;

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

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

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

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

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

Другой способ - использовать оператор, но тебе нужноцитат здесь тоже:

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

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

@ KatinkaHesselink: Ваш комментарий вводит в заблуждение. Вопрос был «Как проверить, существует ли свойство объекта с переменной, содержащей имя свойства?» Herbert Van-Vliet
Это неверно. Поместив кавычки вокруг имени myProp, вы больше не ссылаетесь на значение myProp, скорее вы объявляете новую String () для myProp, и в myObj нет такого свойства myProp. TriumphST
То естьн какhasOwnProperty() реализовано. canon
TriumpST: из MDN, связанного выше, "prop - строка или символ, представляющий имя свойства или индекс массива (не-символы будут приводиться к строкам)." Ben Creasy
Это верно. Если вы не хотите использовать переменную, а просто если присутствует определенный myProp, вам нужны кавычки. Katinka Hesselink

Похожие вопросы