Skip to main content

Проверка класса: "instanceof"

работает длявозвращает
typeofпримитивовстрока
.toStringпримитивов, встроенных объектов, объектов с Symbol.toStringTagстрока
instanceofобъектовtrue/false

Как мы можем видеть, технически {}.toString «более продвинут», чем typeof.

А оператор instanceof – отличный выбор, когда мы работаем с иерархией классов и хотим делать проверки с учётом наследования.

Оператор instanceof

obj instanceof Class

Оператор вернёт true, если obj принадлежит классу Class или наследующему от него.

Object.prototype.toString возвращает тип

У toString имеются скрытые возможности, которые делают метод гораздо более мощным. Мы можем использовать его как расширенную версию typeof и как альтернативу instanceof.

Согласно спецификации встроенный метод toString может быть позаимствован у объекта и вызван в контексте любого другого значения. И результат зависит от типа этого значения.

  • Для числа это будет [object Number]
  • Для булева типа это будет [object Boolean]
  • Для null: [object Null]
  • Для undefined: [object Undefined]
  • Для массивов: [object Array]
  • …и т.д. (поведение настраивается).

Symbol.toStringTag

Поведение метода объектов toString можно настраивать, используя специальное свойство объекта Symbol.toStringTag.

// toStringTag для браузерного объекта и класса
alert( window[Symbol.toStringTag]); // window
alert( XMLHttpRequest.prototype[Symbol.toStringTag] ); // XMLHttpRequest
alert( {}.toString.call(window) ); // [object Window]
alert( {}.toString.call(new XMLHttpRequest()) ); // [object XMLHttpRequest]

В итоге мы получили «typeof на стероидах», который не только работает с примитивными типами данных, но также и со встроенными объектами, и даже может быть настроен.

Можно использовать {}.toString.call вместо instanceof для встроенных объектов, когда мы хотим получить тип в виде строки, а не просто сделать проверку.

🚀 Источник: https://learn.javascript.ru/instanceof