logo

Отрицание instanceof в JavaScript: условный оператор без else

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

Для проверки того, что объект obj не является экземпляром типа Type, применяется конструкция !(obj instanceof Type). Этот подход позволяет точно определить, что объект не был создан на основе конкретного класса или прототипа.

Пример кода:

JS
Скопировать код
if (!(obj instanceof MyClass)) {
  // obj не относится к классу MyClass. Экзамен не сдан!
}

В этом примере замените obj на ваш объект, а MyClass – на класс, который вы хотите проверить. Если obj не был создан на основе MyClass, то условие вернёт значение true. Как вам такое утверждение?

Подробнее о операторе NOT с instanceof

В выражениях без скобок оператор ! имеет приоритет перед instanceof и будет применен в первую очередь. Поэтому при проверке обязательно используйте круглые скобки () вокруг выражения с instanceof, чтобы точно соблюсти порядок выполнения операций. Небрежное отношение к этому правилу может привести к синтаксической ошибке или к некорректному результату.

Правильный вариант:

JS
Скопировать код
if (!(obj instanceof Array)) {
  // obj точно не является массивом.
}

Неправильный вариант:

JS
Скопировать код
if (!obj instanceof Array) {
  // Такое выражение всегда будет ложным для любого объекта, ведь оно вводит в заблуждение.
}

Чтобы повысить читаемость, иногда разработчики используют двойные скобки, хотя это не является обязательным:

JS
Скопировать код
if ((!(obj instanceof Array))) {
  // obj не является массивом, однако мы пошли на перестраховку с дополнительными скобками!
}

Изучение альтернативных подходов

Помимо !(obj instanceof Type), существуют и другие возможности, которые могут увеличить ясность или более точно передать намерения:

Инвертируем логическое значение

JS
Скопировать код
if ((obj instanceof Array) === false) {
  // obj действительно не является массивом. Точка зрения ясна.
}

Использование переменной для наглядности

JS
Скопировать код
const isNotArray = !(obj instanceof Array);
if (isNotArray) {
  // obj не массив, что мы и четко обозначили этим фактом.
}

Такие варианты могут облегчить понимание кода для тех, кто более мало знаком с конструкцией !instanceof.

Остерегайтесь ошибок

Следующие аспекты важно учесть при использовании !instanceof:

  • Запоминание приоритетов: не забывайте о круглых скобках, чтобы не попасть в ловушку приоритетов операторов.
  • Объекты null или undefined: instanceof выбрасывает исключение, если obj равен null или undefined. Поэтому перед проверкой убедитесь в валидности obj.
  • Особенности цепочки прототипов: instanceof анализирует всю цепочку прототипов, поэтому при проверке экземпляра подкласса как суперкласс, результат будет true.

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

Можно представить использование !instanceof как действия бармена в ночном клубе, который отсеивает тех, кто не входит в VIP-список, направляя их в общий зал:

Markdown
Скопировать код
Если 🚶‍♂️ (!instanceof 🎩VIP) {
   🚪👮‍♂️ "Поверьте, в обычном зале тоже неплохо!"
}

В то же время настоящие VIP-персоны без проблем проходят этот фильтр – они входят в список избранных и могут открыть двери в VIP-зону:

JS
Скопировать код
if (!(guest instanceof VIP)) {
  // логика для обычных посетителей, ведь этот гость не из VIP списка.
}

Помните о лучших практиках

При использовании !instanceof обратите внимание на следующие рекомендации:

  • Следите за консистентностью: придерживайтесь одного и того же стиля во всем проекте для улучшения читаемости и упрощения поддержки.
  • Пишите код осознанно, документируйте тщательно: не пренебрегайте комментариями, если типы в вашем коде играют ключевую роль.
  • Проверяйте безопасность: прежде чем использовать instanceof, убедитесь, что obj не равен null или undefined, чтобы избежать ошибок при выполнении.
  • Ищите информацию на MDN: регулярно обновляйте свои знания, консультируясь со справочником MDN по использованию операторов и особенностям JavaScript.

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

  1. instanceof – JavaScript | MDN — полное руководство по использованию instanceof.
  2. Class checking: "instanceof" — разъяснение instanceof с большим количеством примеров.
  3. What is the instanceof operator in JavaScript? – Stack Overflow — обсуждение и примеры использования instanceof.
  4. Prototypes in JavaScript — связь между instanceof и прототипами в JS.
  5. JavaScript Inheritance – Polymorphism and Inheritance — полиморфизм и использование instanceof для понимания наследования в JavaScript.