Как проверить существование свойства объекта, используя переменную с именем свойства?
Я проверяю существование свойства объекта, используя переменную, которая содержит имя этого свойства.
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) {
// выполняем какие-то действия
}
Дополнительные сведения можно найти здесь.
Как удалить свойство из объекта JavaScript?
Преобразование объекта JS в строку JSON
Как получить доступ к вложенным объектам, массивам или JSON и обработать их?
Как удалить все дубликаты из массива объектов?
Почему null является объектом и в чем разница между null и undefined?