update classes
This commit is contained in:
46
docs/javascript/06-classes/05-class-check.md
Normal file
46
docs/javascript/06-classes/05-class-check.md
Normal file
@@ -0,0 +1,46 @@
|
||||
---
|
||||
sidebar_position: 5
|
||||
---
|
||||
|
||||
# Проверка класса: "instanceof"
|
||||
|
||||
| | работает для | возвращает |
|
||||
|-------------|----------------------------------------------------------------|------------|
|
||||
| typeof | примитивов | строка |
|
||||
| {}.toString | примитивов, встроенных объектов, объектов с Symbol.toStringTag | строка |
|
||||
| instanceof | объектов | true/false |
|
||||
|
||||
Как мы можем видеть, технически `{}.toString` «более продвинут», чем `typeof`.
|
||||
|
||||
А оператор `instanceof` – отличный выбор, когда мы работаем с иерархией классов и хотим делать проверки с учётом наследования.
|
||||
|
||||
## Оператор instanceof
|
||||
```js
|
||||
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`.
|
||||
```js
|
||||
// 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` для встроенных объектов, когда мы хотим получить тип в виде строки, а не просто сделать проверку.
|
||||
Reference in New Issue
Block a user