Как стать автором
Обновить

Сравнение JavaScript операторов typeof и insanceof

Время на прочтение3 мин
Количество просмотров8.6K
Автор оригинала: John Au-Yeung

В JavaScript есть операторы typeof и instanceof, на первый взгляд они похоже, но они выполняют разные функции.

В этой статье будет рассмотрена разница между ними и показаны примеры использования.

Typeof оператор

Оператор typeof используется, в основном, для того, чтобы узнать тип примитивного значения.

Если у нас есть числа, больше числа, строки, символы, логические или неопределенные значения мы можем узнать их с помощью оператора.

К примеру, у нас есть :

console.log(typeof 1);  

В терминале отобразится 'number'.

Более полезно, когда у нас есть переменные:

 let foo = 1;
 console.log(typeof foo);  

В таком случае мы можем использовать typeof, чтобы узнать тип переменной foo.

Важно запомнить, что typeof не следует использовать для null, если мы напишем:

 console.log(typeof null);

В терминале отобразится 'object'. Вместо этого следует использовать оператор === ://

 foo === null

Другой пример содержит boolean значения.

typeof false === 'boolean';
typeof Boolean(0) === 'boolean';

Мы также можем проверить числа следующим образом:

typeof Number('1') === 'number';
typeof Number('foo') === 'number';
typeof NaN === 'number';

Обратите внимание, что NaN и вычисления, которые возвращают NaN, такие как Number(‘foo’ ), также относятся к типу 'number' . Мы должны проверить их с помощью метода Number.isNaN().

Для BigInt:

 typeof 2n === 'bigint';

Для строк:

typeof '' === 'string';
typeof 'foo' === 'string';

Для символов:

typeof Symbol() === 'symbol'
typeof Symbol('bar') === 'symbol'

Также, можно использовать typeof для определения типа undefined:

typeof undefined === 'undefined';
let x;
typeof x === 'undefined';

Можно использовать для объектов, однако все объекты возвращают тип 'object', так что это не очень полезно:

typeof new String('foo') === 'object';
typeof new Number(1) === 'object';

Некоторые старые браузеры возвращают «функцию», когда мы применяем оператор typeof к литералам регулярных выражений. Однако сегодня это не должно быть проблемой.

Исключения

Typeof document.all всегда возвращает undefined, даже если он определен во всех браузерах.

Оператор instanceof

Оператор instanceof проверяет, появляется ли свойство прототипа конструктора где-либо в цепочке прототипов объекта.

Это означает, что мы можем использовать его, чтобы проверить, является ли объект конструктором из данного класса или функции-конструктора.

Он возвращает true, если объект является экземпляром класса или функции-конструктора, и false в противном случае.

Например, если у нас есть:

class Foo {};
let foo = new Foo();
console.log(foo instanceof Foo);
function Bar (){};
let bar = new Bar();
console.log(bar instanceof Bar);

В терминале будет два "true".

Все, что создано с помощью new, можно проверить с помощью оператора instanceof.

Instanceof полезен для проверки всего, что создано с помощью оператора new, включая строки, логические значения и числа.

Например, если у нас есть:

let foo = new String('foo');
console.log(typeof foo);
console.log(foo instanceof String);

Затем мы получаем 'object' из первого console.log и true для второго.

Это связано с тем, что мы создали экземпляр объекта String вместо строки примитивного значения, хотя в противном случае мы можем использовать примитивную строку и строковые объекты таким же образом.

Литеральные объекты

Литералы объектов, созданные без оператора new, являются экземплярами Object.

Итак, если у нас есть:

console.log({} instanceof Object);

Выведется 'true'

Все объекты являются экземплярами Object в дополнение к тому, что они являются экземплярами конструктора, из которого они созданы. Например, если у нас есть:

let date = new Date();
console.log(date instanceof Object);
console.log(date instanceof Date);

В обоих случаях выведутся значение true, поскольку date является экземпляром конструктора Date, а все непримитивные объекты являются экземплярами Object.

Выводы

Оператор typeof и instanceof совершенно разные. typeof возвращает тип объекта, над которым он работает.

Instanceof of возвращает true, если объект создан из данного конструктора, и false в противном случае.

Все непримитивные объекты являются экземплярами Object, поэтому он всегда будет возвращать true.

Теги:
Хабы:
Всего голосов 6: ↑0 и ↓6-6
Комментарии7

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
11 сентября
Митап по BigData от Честного ЗНАКа
Санкт-ПетербургОнлайн
19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн