Проверка наличия свойства в объекте JS: методы без typeof
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы обнаружить наличие конкретного свойства в объекте, воспользуйтесь выражением 'propertyName' in object
для учета унаследованных свойств или методом object.hasOwnProperty('propertyName')
, если хотите проверить лишь собственные свойства объекта:
if ('age' in person) {
// Свойство 'age' присутствует в объекте, возможно, оно унаследовано.
}
if (person.hasOwnProperty('age')) {
// Свойство 'age' является собственным этого объекта, не унаследовано.
}
Точное определение наличия свойства
Точность в JavaScript – это что-то в духе искусства. Иногда ответ не столь очевиден, как может казаться:
Бдите: значения undefined и null
Свойства объекта могут быть намеренно заданы на undefined
или null
, и это может вызвать заблуждения:
const universe = { matter: undefined };
'matter' in universe; // Возвращает true, так как свойство 'matter' существует и равно undefined.
universe.matter !== undefined; // Вернёт false и может вызвать путаницу.
Собственные и унаследованные свойства
Метод hasOwnProperty
ищет только собственные свойства объекта, унаследованные он не затрагивает. А вот оператор in
проверяет наличие свойства на всех уровнях прототипного наследования:
function Ancestry() {
this.inherited = true;
}
Ancestry.prototype.familySilver = 'stylish';
const descendant = new Ancestry();
descendant.hasOwnProperty('inherited'); // Возвращает true, так как 'inherited' является собственным свойством.
'familySilver' in descendant; // Возвращает true, поскольку свойство 'familySilver' унаследовано.
Проверка перед взаимодействием с объектом
Прежде чем обращаться к свойствам объекта, убедитесь, что он не равен undefined
или null
, во избежание ошибок выполнения:
if (typeof treasureMap !== 'undefined' && treasureMap !== null && 'X' in treasureMap) {
// Если карта существует и 'X' обозначает местоположение сокровища.
}
Погрузитесь подробнее, воспользуйтесь этими методами
Работа с объектами в JavaScript порой напоминает разгадывание головоломки:
Современные методы: утилиты из библиотек
Библиотеки, например, Underscore.js или Lodash, предоставляют методы вроде _.has(object, 'property')
, облегчающие работу с объектами.
API Reflect: расширенные возможности
Современный JavaScript предлагает более сложные инструменты, такие как Reflect.has(object, propertyKey)
, которые выполняют подобные функции в рамках API Reflect.
Визуализация
Для наглядности представим аналогию: вы находитесь в инструментальной мастерской (🛠️), где есть разнообразные инструменты:
Содержимое мастерской: [🔨, 🪓, 🔧, 🪚]
Проверим, имеется ли '🔧' (гаечный ключ) в мастерской:
'wrench' in shedContents; // Проверяем наличие гаечного ключа.
Результат проверки:
| Запрос | Инструмент найден? |
| ----------------- | ------------------ |
| 'wrench' in shed | ✅ |
| 'saw' in shed | ❌ |
Использование оператора in
можно сравнить с металлоискателем: нет нужды в раскопках, достаточно пройтись по поверхности.
Настоящие волшебники JavaScript оставили несколько заметок для вас
Когда дело доходит до тонкостей JavaScript, знание нескольких хитростей может пригодиться:
Перечисляемость свойств
Перечисляемость свойств в JavaScript может сделать их невидимыми при переборе:
const magicBook = Object.create({}, {
hiddenSpell: {
value: true,
enumerable: false
}
});
'hiddenSpell' in magicBook; // Возвращает true
magicBook.propertyIsEnumerable('hiddenSpell'); // Возвращает false, свойство не перечисляемое.
Встроенные свойства объекта
Глобальные свойства объекта, вроде toString
, могут вести себя несколько неожиданно:
({}).hasOwnProperty('toString'); // Возвращает false, поскольку toString – встроенное свойство.
Объекты без прототипа
Объекты без прототипа не следуют стандартной иерархии прототипов JavaScript и могут вести себя нестандартно при использовании hasOwnProperty
:
const alienObject = Object.create(null);
alienObject.key = true;
typeof alienObject.hasOwnProperty; // Возвращает undefined, так как у alienObject отсутствует прототип с hasOwnProperty.
'key' in alienObject; // Возвращает true.
Полезные материалы
- Статья на MDN про hasOwnProperty — углубите своё понимание метода
hasOwnProperty
. - Обсуждения на Stack Overflow о проверке свойств — изучите мнения и советы сообщества.
- Документация MDN по оператору 'in' — уясните детали работы оператора
in
. - Использование Reflect.has() согласно MDN — посвятите время изучению Reflect.has() для повышения надёжности проверок.
- Руководство от DigitalOcean по
in
иhasOwnProperty()
— обозрите детальные объяснения использования этих методов. - Статья MDN о правдивости (truthy) и ложности (falsy) значений — разберитесь, как интерпретируются значения в JavaScript.
- Тестирование производительности на JSBench.me — проверьте эффективность различных подходов на практике.