Как проверить существование свойства объекта, используя переменную с именем свойства?
Я проверяю существование свойства объекта, используя переменную, которая содержит имя этого свойства.
var myObj;
myObj.prop = "exists";
var myProp = "p" + "r" + "o" + "p";
if (myObj.myProp) {
alert("да, у меня есть это свойство");
}
Однако это возвращает undefined, потому что происходит поиск свойства myObj.myProp, а мне нужно, чтобы проверялось свойство myObj.prop. Как мне это исправить?
5 ответ(ов)
В данном примере вы рассматриваете два способа проверки наличия свойства в объекте JavaScript: hasOwnProperty и оператор in.
- Использование метода
hasOwnProperty:
var myProp = 'prop';
if(myObj.hasOwnProperty(myProp)){
alert("да, у меня есть это свойство");
}
Метод hasOwnProperty проверяет наличие свойства только в самом объекте myObj и игнорирует унаследованные свойства, то есть вернет true только если prop является собственным свойством myObj.
- Использование оператора
in:
var myProp = 'prop';
if(myProp in myObj){
alert("да, у меня есть это свойство");
}
Оператор in, в отличие от hasOwnProperty, проверяет наличие свойства как в самом объекте, так и во всех его прототипах. Это означает, что будет возвращено true, даже если свойство prop унаследовано от прототипа.
- Проверка без переменной:
if('prop' in myObj){
alert("да, у меня есть это свойство");
}
Этот код делает то же самое, что и предыдущие примеры, но проверяет наличие свойства непосредственно с именем 'prop'.
Важно помнить, что свойство constructor, например, будет найдено с помощью in, но не будет возвращено hasOwnProperty, если оно унаследовано от прототипа. Это ключевое различие, которое важно учитывать при выборе метода проверки наличия свойств.
Спасибо всем за помощь и за то, что настаивали на удалении оператора eval.
Важный момент заключается в том, что переменные нужно использовать в квадратных скобках, а не в точечной нотации. Это решение работает и является чистым, правильным кодом.
Каждая из этих переменных: appChoice, underI, underObstr.
Вот исправленный код:
if (typeof tData.tonicdata[appChoice][underI][underObstr] !== "undefined") {
// вставьте код здесь
}
Для проверки наличия собственного свойства в объекте в 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 проверяет именно значение, которое может быть не определено.
Дополнительная информация доступна по следующим ссылкам:
Вы можете использовать как метод hasOwnProperty(), так и оператор in. Оба инструмента позволяют проверить наличие свойства в объекте, но они имеют некоторые различия:
hasOwnProperty(): этот метод проверяет, принадлежит ли указанное свойство непосредственно объекту и не унаследовано ли оно от прототипа. Например:
const obj = { a: 1 };
console.log(obj.hasOwnProperty('a')); // true
console.log(obj.hasOwnProperty('b')); // false
- Оператор
in: этот оператор проверяет, существует ли свойство в объекте, включая унаследованные свойства от прототипа. К примеру:
const obj = { a: 1 };
console.log('a' in obj); // true
console.log('b' in obj); // false
Таким образом, если вам нужно проверить только собственные свойства объекта, используйте hasOwnProperty(). Если же вам нужно учитывать все свойства, включая унаследованные, используйте оператор in.
Вы можете использовать метод hasOwnProperty, но обратите внимание, что при его использовании вам нужно использовать кавычки:
if (myObj.hasOwnProperty('myProp')) {
// выполняем какие-то действия
}
Более подробную информацию можно найти по этой ссылке.
Другой способ — это использовать оператор in, также необходимо использовать кавычки:
if ('myProp' in myObj) {
// выполняем какие-то действия
}
Дополнительные сведения можно найти здесь.
Преобразование объекта JS в строку JSON
Как проверить наличие ключа в объекте JavaScript?
Как удалить все дубликаты из массива объектов?
Как получить подмножество свойств объекта JavaScript?
Какова разница между `throw new Error` и `throw someObject`?