8

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

5

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

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

if (myObj.myProp) {
    alert("да, у меня есть это свойство");
}

Однако это возвращает undefined, потому что происходит поиск свойства myObj.myProp, а мне нужно, чтобы проверялось свойство myObj.prop. Как мне это исправить?

5 ответ(ов)

15

В данном примере вы рассматриваете два способа проверки наличия свойства в объекте JavaScript: hasOwnProperty и оператор in.

  1. Использование метода hasOwnProperty:
var myProp = 'prop';
if(myObj.hasOwnProperty(myProp)){
    alert("да, у меня есть это свойство");
}

Метод hasOwnProperty проверяет наличие свойства только в самом объекте myObj и игнорирует унаследованные свойства, то есть вернет true только если prop является собственным свойством myObj.

  1. Использование оператора in:
var myProp = 'prop';
if(myProp in myObj){
    alert("да, у меня есть это свойство");
}

Оператор in, в отличие от hasOwnProperty, проверяет наличие свойства как в самом объекте, так и во всех его прототипах. Это означает, что будет возвращено true, даже если свойство prop унаследовано от прототипа.

  1. Проверка без переменной:
if('prop' in myObj){
    alert("да, у меня есть это свойство");
}

Этот код делает то же самое, что и предыдущие примеры, но проверяет наличие свойства непосредственно с именем 'prop'.

Важно помнить, что свойство constructor, например, будет найдено с помощью in, но не будет возвращено hasOwnProperty, если оно унаследовано от прототипа. Это ключевое различие, которое важно учитывать при выборе метода проверки наличия свойств.

0

Спасибо всем за помощь и за то, что настаивали на удалении оператора eval.

Важный момент заключается в том, что переменные нужно использовать в квадратных скобках, а не в точечной нотации. Это решение работает и является чистым, правильным кодом.

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

Вот исправленный код:

if (typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined") {
    // вставьте код здесь
}
0

Для проверки наличия собственного свойства в объекте в JavaScript можно использовать метод Object.prototype.hasOwnProperty. Это предпочтительнее, чем использовать loan.hasOwnProperty(..), поскольку в случае, если в цепочке прототипов будет определен собственный метод hasOwnProperty, это может привести к ошибочным результатам.

Пример кода для проверки собственного свойства:

var loan = { amount: 150 };
if (Object.prototype.hasOwnProperty.call(loan, "amount")) { 
   // выполнится
}

Если же вы хотите учитывать также унаследованные свойства, можно использовать оператор in. Важно помнить, что правой частью оператора in должно быть объектное значение; использование примитивов приведет к ошибке.

Пример проверки с оператором in:

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");

Также стоит отметить, что использование оператора typeof и доступ к свойствам через квадратные скобки может быть обманчивым:

var loan = { amount: 150 };

loan.installment = undefined;

if("installment" in loan) // верно
{
    // выполнится
}

if(typeof loan["installment"] !== "undefined") // неверно
{
    // не выполнится
}

Это связано с тем, что оператор in проверяет наличие свойства в объекте, вне зависимости от того, имеет ли оно значение undefined, тогда как typeof проверяет именно значение, которое может быть не определено.

Дополнительная информация доступна по следующим ссылкам:

0

Вы можете использовать как метод hasOwnProperty(), так и оператор in. Оба инструмента позволяют проверить наличие свойства в объекте, но они имеют некоторые различия:

  1. hasOwnProperty(): этот метод проверяет, принадлежит ли указанное свойство непосредственно объекту и не унаследовано ли оно от прототипа. Например:
const obj = { a: 1 };
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('b')); // false
  1. Оператор in: этот оператор проверяет, существует ли свойство в объекте, включая унаследованные свойства от прототипа. К примеру:
const obj = { a: 1 };
console.log('a' in obj); // true
console.log('b' in obj); // false

Таким образом, если вам нужно проверить только собственные свойства объекта, используйте hasOwnProperty(). Если же вам нужно учитывать все свойства, включая унаследованные, используйте оператор in.

0

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

if (myObj.hasOwnProperty('myProp')) {
    // выполняем какие-то действия
}

Более подробную информацию можно найти по этой ссылке.

Другой способ — это использовать оператор in, также необходимо использовать кавычки:

if ('myProp' in myObj) {
    // выполняем какие-то действия
}

Дополнительные сведения можно найти здесь.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь