Проверка наличия свойства в объекте JS: методы без typeof

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы обнаружить наличие конкретного свойства в объекте, воспользуйтесь выражением 'propertyName' in object для учета унаследованных свойств или методом object.hasOwnProperty('propertyName'), если хотите проверить лишь собственные свойства объекта:

JS
Скопировать код
if ('age' in person) {
  // Свойство 'age' присутствует в объекте, возможно, оно унаследовано.
}

if (person.hasOwnProperty('age')) {
  // Свойство 'age' является собственным этого объекта, не унаследовано.
}
Кинга Идем в IT: пошаговый план для смены профессии

Точное определение наличия свойства

Точность в JavaScript – это что-то в духе искусства. Иногда ответ не столь очевиден, как может казаться:

Бдите: значения undefined и null

Свойства объекта могут быть намеренно заданы на undefined или null, и это может вызвать заблуждения:

JS
Скопировать код
const universe = { matter: undefined };

'matter' in universe; // Возвращает true, так как свойство 'matter' существует и равно undefined.
universe.matter !== undefined; // Вернёт false и может вызвать путаницу.

Собственные и унаследованные свойства

Метод hasOwnProperty ищет только собственные свойства объекта, унаследованные он не затрагивает. А вот оператор in проверяет наличие свойства на всех уровнях прототипного наследования:

JS
Скопировать код
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, во избежание ошибок выполнения:

JS
Скопировать код
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.

Визуализация

Для наглядности представим аналогию: вы находитесь в инструментальной мастерской (🛠️), где есть разнообразные инструменты:

Markdown
Скопировать код
Содержимое мастерской: [🔨, 🪓, 🔧, 🪚]

Проверим, имеется ли '🔧' (гаечный ключ) в мастерской:

JS
Скопировать код
'wrench' in shedContents; // Проверяем наличие гаечного ключа.

Результат проверки:

Markdown
Скопировать код
| Запрос            | Инструмент найден? |
| ----------------- | ------------------ |
| 'wrench' in shed  | ✅                 |
| 'saw' in shed     | ❌                 |

Использование оператора in можно сравнить с металлоискателем: нет нужды в раскопках, достаточно пройтись по поверхности.

Настоящие волшебники JavaScript оставили несколько заметок для вас

Когда дело доходит до тонкостей JavaScript, знание нескольких хитростей может пригодиться:

Перечисляемость свойств

Перечисляемость свойств в JavaScript может сделать их невидимыми при переборе:

JS
Скопировать код
const magicBook = Object.create({}, {
  hiddenSpell: {
    value: true, 
    enumerable: false
  }
});

'hiddenSpell' in magicBook; // Возвращает true
magicBook.propertyIsEnumerable('hiddenSpell'); // Возвращает false, свойство не перечисляемое.

Встроенные свойства объекта

Глобальные свойства объекта, вроде toString, могут вести себя несколько неожиданно:

JS
Скопировать код
({}).hasOwnProperty('toString'); // Возвращает false, поскольку toString – встроенное свойство.

Объекты без прототипа

Объекты без прототипа не следуют стандартной иерархии прототипов JavaScript и могут вести себя нестандартно при использовании hasOwnProperty:

JS
Скопировать код
const alienObject = Object.create(null);
alienObject.key = true;

typeof alienObject.hasOwnProperty; // Возвращает undefined, так как у alienObject отсутствует прототип с hasOwnProperty.
'key' in alienObject; // Возвращает true.

Полезные материалы

  1. Статья на MDN про hasOwnProperty — углубите своё понимание метода hasOwnProperty.
  2. Обсуждения на Stack Overflow о проверке свойств — изучите мнения и советы сообщества.
  3. Документация MDN по оператору 'in' — уясните детали работы оператора in.
  4. Использование Reflect.has() согласно MDN — посвятите время изучению Reflect.has() для повышения надёжности проверок.
  5. Руководство от DigitalOcean по in и hasOwnProperty() — обозрите детальные объяснения использования этих методов.
  6. Статья MDN о правдивости (truthy) и ложности (falsy) значений — разберитесь, как интерпретируются значения в JavaScript.
  7. Тестирование производительности на JSBench.me — проверьте эффективность различных подходов на практике.