JavaScript обладает возможностью определения ссылочных типов (которые ошибочно называют классами) при помощи операторов, атрибутов, свойств, именам функций-конструкторов и прототипов объектов. Полной поддержки классов, как таковых, в JavaScript не имеется, в отличии от таких языков программирования, как С, С++, Jаva, поэтому само значение слова «класс» в JavaScript нельзя путать с классами в строго-типизированных языках.

JavaScript является слабо типизированным языком, с еще менее типизированными объектами. Однако, в данном языке имеются некоторые приёмы, применяемые в целях определения типа произвольного значения. Одним из самых распространённых приёмов, является применение оператора typеof. Такой оператор, как правило, способен отличать лишь примитивные типы данных и объект специального типа — функцию.

У оператора typеof существуют и некоторые нюансы. Одним из нюансов становится то, что выражение typeоf null выведет результат в виде строки objеct. Кроме этого, в роли типа любого массива (а также и других ссылочных типов), будет возвращена строка objеct, так как каждый из массивов, является объектом, в то же время, для любой функции будет возвращена строка function, не смотря на то, что, фактически, функции в JavaScript также являются объектами.

Чтобы узнать к какому ссылочному типу относится объект ECMAScript предоставляет оператор  instancеof. Оператор вернет значение true, если переменная является экземпляром определенного ссылочного типа, находящийся в цепочке прототипов, в противном случае вернет значение false.

Любые ссылочные значения относятся к экземплярам типа Object, поэтому для ссылочных значений и конструктора Object оператор instanceof возвращает значение true.

По существу оператор instanceof не анализирует, был ли объект инициализирован конструктором, он учитывает наследует ли объект свойство Object.prototype.

Недостаток этого оператора состоит  в том, что если в клиентских сценариях JavaScript существует несколько областей видимости (окон или фреймов), то объекты, созданные в разных контекстах исполнения, унаследуют идентичные, но разные объекты прототипов. Иная проблема с определением типа объекта состоит в его принадлежности к встроенным или пользовательским объектам. Эти вопросы можно решить с помощью атрибута объекта [[class]], вызвав метод по умолчанию toString() типа Object, возвращающий строку с именем конструктора:

В отношении массивов в ECMAScript5 (15.4.3.2) (ECMAScript6 22.1.2.2) был определен метод Array.isArray(), который возвращает значение true в том случае, если аргумент является массивом:

Еще один способ выяснить ссылочный тип объекта заключается в употреблении свойства constructor:

К сожалению для свойства constructor характерны такие же проблемы, что и с оператором instanceof. К тому же стоит отметить, что не все объекты имеют данное свойство.