JavaScript typeof
In JavaScript there are 5 different data types that can contain values:
- string
- number
- boolean
- object
- function
There are 6 types of objects:
- Object
- Date
- Array
- String
- Number
- Boolean
And 2 data types that cannot contain values:
- null
- undefined
The typeof Operator
You can use the typeof operator to find the data type of a JavaScript variable.
Example
- The data type of NaN is number
- The data type of an array is object
- The data type of a date is object
- The data type of null is object
- The data type of an undefined variable is undefined *
- The data type of a variable that has not been assigned a value is also undefined *
You cannot use typeof to determine if a JavaScript object is an array (or a date).
Primitive Data
A primitive data value is a single simple data value with no additional properties and methods.
The typeof operator can return one of these primitive types:
- string
- number
- boolean
- undefined
Example
Complex Data
The typeof operator can return one of two complex types:
- function
- object
The typeof operator returns "object" for objects, arrays, and null.
The typeof operator does not return "object" for functions.
Example
The typeof operator returns " object " for arrays because in JavaScript arrays are objects.
The Data Type of typeof
The typeof operator is not a variable. It is an operator. Operators ( + — * / ) do not have any data type.
But, the typeof operator always returns a string (containing the type of the operand).
The constructor Property
The constructor property returns the constructor function for all JavaScript variables.
Example
You can check the constructor property to find out if an object is an Array (contains the word "Array"):
Example
Or even simpler, you can check if the object is an Array function:
Example
You can check the constructor property to find out if an object is a Date (contains the word "Date"):
Example
Or even simpler, you can check if the object is a Date function:
Example
Undefined
In JavaScript, a variable without a value, has the value undefined . The type is also undefined .
Example
Any variable can be emptied, by setting the value to undefined . The type will also be undefined .
Example
Empty Values
An empty value has nothing to do with undefined .
An empty string has both a legal value and a type.
Example
In JavaScript null is "nothing". It is supposed to be something that doesn’t exist.
Unfortunately, in JavaScript, the data type of null is an object.
You can consider it a bug in JavaScript that typeof null is an object. It should be null .
You can empty an object by setting it to null :
Example
You can also empty an object by setting it to undefined :
Example
Difference Between Undefined and Null
undefined and null are equal in value but different in type:
typeof undefined // undefined
typeof null // object
null === undefined // false
null == undefined // true
The instanceof Operator
The instanceof operator returns true if an object is an instance of the specified object:
Example
(cars instanceof Array);
(cars instanceof Object);
(cars instanceof String);
(cars instanceof Number);
The void Operator
The void operator evaluates an expression and returns undefined. This operator is often used to obtain the undefined primitive value, using "void(0)" (useful when evaluating an expression without using the return value).
typeof
Оператор typeof возвращает строку, указывающую тип операнда.
Интерактивный пример
Синтаксис
Операнд следует за оператором typeof :
Параметры
operand является выражением, представляющим объект или примитив, тип которого должен быть возвращён.
Описание
В следующей таблице приведены возможные возвращаемые значения typeof . Дополнительная информация о типах и примитивах находится на странице структуры данных JavaScript.
| Type | Result |
|---|---|
| Undefined | «undefined» |
| Null | «object» (смотрите ниже) |
| Boolean | «boolean» |
| Number | «number» |
| String | «string» |
| Symbol (новый тип из ECMAScript 2015) | «symbol» |
| Host object (определено JS окружением) | Зависит от реализации |
| Function object (реализует [[Call]] в терминах ECMA-262) | «function» |
| Любой другой тип | «object» |
Примеры
В первой реализации JavaScript значения были представлены парой тип тега и значение. Тип тега для объектов равнялся 0. null был представлен как нулевой указатель (0x00 в большинстве платформ). Следовательно, тип тега для null равнялся нулю, поэтому возвращаемое значение typeof является фиктивным. (подробнее)
Исправление было предложено в ECMAScript (через отключение), но было отклонено. Это привело бы к тому, что typeof null === ‘null’ .
Использование оператора new
Регулярные выражения
Вызываемые регулярные выражения были нестандартным дополнением в некоторых браузерах.
Ошибки, связанные с временными мёртвыми зонами
До ECMAScript 2015, гарантировалось, что оператор typeof вернёт строку для любого операнда, с которым он был вызван. Это изменилось после добавления не поднимающихся объявлений let and const с блочной областью видимости. Теперь, если переменные объявлены с помощью let и const , и для них вызывается typeof в блоке объявления переменных, но до объявления, то выбрасывается ReferenceError . Поведение отличается от необъявленных переменных, для которых typeof вернёт ‘undefined’. Переменные с блочной областью видимости находятся в «временной мёртвой зоне», которая длится от начала блока до момента объявления переменных. В этой зоне попытка доступа к переменным выбрасывает исключение.
Исключения
Во всех текущих браузерах существует нестандартный host-объект document.all , который имеет тип Undefined.
Хотя спецификация разрешает собственные имена типов для нестандартных экзотических объектов, требуется чтобы эти имена отличались от предопределённых. Ситуация, когда document.all имеет тип undefined должна рассматриваться как исключительное нарушение правил.
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-typeof-operator |
Совместимость с браузерами
BCD tables only load in the browser
IE-специфичные замечания
В IE 6, 7 и 8 многие host-объекты являются объектами, но не функциями. Например:
what is the best way to check variable type in javascript
I want to check the type of capitalized , so I use capitalized instanceof String ? But it shows: false in console, I do not want to try capitalized instanceof Function , Object . It will take too much time, so what is the best way to detect a variable type?
8 Answers 8
The best way is to use the typeof keyword.
The typeof operator maps an operand to one of six values: «string» , «number» , «object» , «function» , «undefined» and «boolean» . The instanceof method tests if the provided function’s prototype is in the object’s prototype chain.
This Wikibooks article along with this MDN articles does a pretty good job of summing up JavaScript’s types.
Keep in mind that, typeof is only good for returning the «primitive» types, number, boolean, object, string. You can also use instanceof to test if an object is of a specific type.
![]()
2021+ one liner answer.
My favourite way is not to use typeof
Why? because it doesn’t give true type for other than boolean, string, number & function.
Then what? Here is small utility function using Object.prototype
![]()
![]()
The best way is using typeof
I made a function with help of jQuery library code, jQuery library type method github link .
You can call it as getType(«Hello»)
![]()
typeof capitalized == ‘string’
The getVarType method (below) works for almost all variables. Check out this fiddle. It first uses the very fast typeof for cases where the results are reliable. Then it uses a more expensive toString method for other cases. Finally, if it is dealing with a named object (as returned by Firefox for objects like document.location) it checks for Array-like objects and reports them as arrays.
In comparison, typeof is embarrassingly poor. typeof([]) returns ‘object’, typeof(new Number()) returns object. It also returns ‘object’ for many other variables that aren’t (for practical purposes) objects. See the fiddle results for a comparison.
typeof
Вызов typeof возвращает строку, содержащую информацию о типе операнда.
Оператор typeof используется в двух формах:
- typeof operand
- typeof (operand)
Эти формы идентичны: можно использовать скобки, а можно и не использовать — работает одинаково.
Оператор возвращает тип в виде строки, например:
Тип typeof возвращается, исходя из следующей таблицы соответствия типам javascript:
| Тип | Результат |
|---|---|
| Undefined | «undefined» |
| Null | «object» |
| Boolean | «boolean» |
| Number | «number» |
| String | «string» |
| Function | «function» |
| Любой другой объект | «object» |
Часто возникают вопросы — почему и зачем таблица именно такая? Ответ простой: потому что так получилось по ходу развития javascript.
В старом javascript-коде можно увидеть применение typeof для проверки существования переменной:
В современном javascript лучше писать:
или, зачастую, подойдет и просто:
P.S. Использовать просто if(var) нельзя, так как доступ к неопределенной переменной вызовет ошибку. Ну а обращение к отсутствующему свойству глобального объекта window всего лишь вернет undefined
Кроме того, оператор typeof используется для полиморфизма. Например, следующая функция получает узел DOM или ID узла и в обоих случаях корректно прячет узел.
См. также
-
/Стандарт языка/
Думаю что так писать не стоит. Вот пример, когда этот метод не сработает:
Никто в здравом уме не будет переопределять undefined во что-либо другое.
Думаю что на здравый ум полагаться не стоит, а потому, надежной проверкой будет проверка при помощи typeof.
Забавный комментарий. На чей здравый ум не стоит полагаться? На свой или на чужой?
Конечно же на чужой . Ведь в большинстве случаев я использую сторонние библиотеки.
if (window.var !== undefined)
без объявленной переменной undefined вы сравниваете одну несуществующую переменной с другой;) сравнивать нужно со строкой «undefined» (в кавычках. ), так что проблемы с объявлением переменной undefined никакой нет.
Как то вы объясняете плохо. Пока в другом месте не нашел непонятно.
Операция typeof возвращает строку, содержащую информацию о типе операнда. Она имеет вид:
typeof expr или typeof(expr)
где expr — любое выражение. Возвращаемое значение может быть одной из шести строк: «number» (число), «string» (строка), «boolean» (логическое значение), «object» (объект), «function» (функция) или «undefined» (неопределенное значение). Примеры:
var size = 1;
var shape = «круглый»;
var today = new Date();
typeof(size); // возвращает «number»
typeof shape; // возвращает «string»
typeof today; // возвращает «object»
В современном javascript оператор typeof практически не используется. Например, вместо проверки:
if (typeof(var) == «undefined»)
можно писать:
if (window.var !== undefined)
или, зачастую, подойдет и просто:
if (window.var)
Вообще, по смысловой нагрузке, проверка существования переменной в объекте переменных, либо, что эта переменная имеет значение undefined, может быть осуществлена либо через:
либо (в глобальной области) с помощью оператора in:
Опять же, проверка с typeof позволяет проверить наличие переменной и во вложенном контексте (например, в функции), чего нельзя сделать при помощи window.var или window.var !== undefined. Более того, в предпоследнем случае, объект может иметь значение false, что полностью меняет смысл проверки.
Поэтому, typeof вполне себе используется в современном ES.
Теоретически да, typeof может проверить наличие переменной в текущем контексте.
Однако, в реальных приложениях на современном(да и на несовременном тоже) javascript этого не нужно.
Локальная переменная, объявленная при помощи var, не нуждается в typeof : достаточно простого if (myVar !== undefined) .
Поэтому для проверки на undefined оператор typeof в современном javascript не используется.
Т.е. предлагаете делать две проверки на существование переменной в контекстах?
А вы не знаете, что творится в локальном контексте вашей функции? Если у вас есть переменная в локальном контексте — проверяйте её без typeof, если нету, то зачем её вообще проверять?
А если я хочу проверить является ли переменная именно целым числом, то никак?? что мне, циклом разбивать его и проверять каждый символ? //
остаток от деления на 1 всегда 0, делить нада на 2
Мы проверяем не на четность / нечетность, а на целость / дробность.
комментаторов выше в топку.
type==undefined работает далеко не всегда, особенно в ИЕ.
не приходилось видеть сообщение undefined is undefined? ))
приходится использовать конструкцию
if (typeof myvar == ‘undefined’ || typeof myvar==’null’ || typeof myvar==’unknown’) <
Что еще за typeof myvar==’null’?
Проверил, в ИЕ работает.
Это для отладки в Firefox Firebug. После отладки функции можно не закоментирововать и не удалять. Можна готовую работу заказщику отправлять.
Number.MIN_VALUE > 0; // true or false?
typeof null; // what type?
null === Object; // true or false?
NaN === NaN; // true or false?
typeof NaN; // what type?
Number.MIN_VALUE > 0; // true
/*
Дело в том, что MIN_VALUE это наименьшее число, БОЛЬШЕ НУЛЯ
*/
typeof null; // object
null === Object; // false
/*
null, хоть и имеет тип «object», не является Object’ом
*/
NaN === NaN; // false
/*
Впечатляет, да? Я не могу найти этому объяснения. Автор же просто предполагает, что некоторые люди любят иногда понюхать клей.
*/
typeof NaN; // number
/*
Вот это сильно. Если вдруг кто не помнит, NaN — not a number.
*/
NaN === NaN; // false
Логически всё верно. NotaNumber1 = object1. NotaNumber2 = object2. object1 != object2. следовательно, NaN != NaN ни при каких обстоятельствах.
typeof null; // object
null === Object; // false
/*
null, хоть и имеет тип «object», не является Object’ом
*/
В том, что ключевое слово null не равняется ссылке на конструктор объекта, есть что-то неожиданное или неправильное?
‘blabla’ === String тоже вернет false, и что?
Number.MIN_VALUE > 0; // true
/*
Хотя бы попробовал вывести это число сначала. Это наименьшее число, в смысле по модулю, оно хоть и очень маленькое, но всё же больше нуля.
*/
NaN === NaN; // false
/*
А по твоему должно быть иначе:
Math.sqrt(-1) === (+»Not a Number»); //true или false? я думаю false
*/
typeof NaN; // number
/*
NaN — это специфичное значение Number, посмотри напр в википедии.
Используется вместо генерации исключения, когда значение не удаётся посчитать, напр Math.sqrt(-1), 0/0. Есть и другие специфичные значения у Number, например Infinity. И это логично: что мы получим разделив число на число, пожалуй, число, а число на число 0 — тоже число, только это число Infinity (бесконечность) (но 0/0 == NaN), можно взять арктангенc Infinity и будет 90 град.
*/
опасный способ. всё время нужно думать о том, что var может быть определена, но кастоваться в false. имхо, это стоит добавить в статью.
вы хоть бы проверили в консоле.
а мне прикольно typeof() использовать
По поводу typeOf: весьма полезная штука, спасала не раз и не два.
Особенно в случаях когда используешь сторонние JS модули, написанные любителями быстрых но недальновидных решений. Типа этого:
.
Array.prototype.indexOfObjWithItem = function (name, item, fromIndex) <
if (fromIndex == null) <
fromIndex = 0;
> else if (fromIndex < 0) <
fromIndex = Math.max(0, this.length + fromIndex);
>
for (var i = fromIndex, j = this.length; i < j; i++) <
if (this[i][name] === item) return i;
>
return -1;
>;
.
После чего предлагаю подумать что произойдет в цикле ниже:
var arr = [], str = «»;
arr.a = < val: function () < return 1 >>
arr.b = < val: function () < return 2 >>
for (item in arr) <
str += arr[item].val() + «,»;
>
лечится например так:
if (typeof item == «function») continue;
а что, если Global — не window, как, например, в node.js или любой другой не-браузерной среде? В таком случае typeof someVar != ‘undefined’ будет работать, а someVar != undefined выкинет ReferenceError
Итого, typeof someVar != ‘undefined’ просто безопаснее и «кроссплатформеннее», т.к. typeof не пытается брать значения операнда, а сразу возвращает «undefined», если свойство с таким именем не найдено. См. production:
————
if Type(val) is Reference, then
If IsUnresolvableReference(val) is true, return «undefined».
————
На сайте youtube.com код
вызывается в глобальной области видимости. Почему это работает (если это работает)? yt проверяется без window и код на этом должен прекратить выполняться.
И для чего используется
По поводу var yt = yt || <>. Дело в том, что JavaScript очень коварный язык. Он лишь кажется простым. На деле же он является одним из самых сложных для понимания. В данном случае код работает из-за особенности обработки директивы var. Все директивы var обрабатываются на входе в процедуру, не зависимо от того в каком месте этой процедуры они написаны. Иными словами
Получается yt как бы была объявлена до этой проверки. Потому и нет ошибки. Хотя я бы не стал так делать, ибо не наглядно и может стать причиной косяков.
Более того, у этой особенности языка есть неприятные подводные камни. Так, если вверху процедуры вы попытаетесь использовать глобальную переменную
а потом внизу этой же процедуры объявите локальную переменную
То получится что пятерку вы ранее присваивали локальной переменной, а не глобальной. Глобальная же переменная при этом становится недоступна в пределах всей процедуры. Потому что, например:
Это На самом деле:
При желании вы вообще можете объявить все локальные переменные в самом низу, при этом они будут доступны, так словно вы объявили их вверху. Это ни в коем случае не стоит расценивать как рекомендацию. Наоборот, я бы рекомендовал, подобного всячески избегать.
Ну и напоследок комплексный пример:
Ну а что касается swf, то предположу что автору этого кода просто нравится писать в таком стиле. Кроме того, обычно использовать прямое присвоение полям класса какого-либо числового или строкового значения считается плохим тоном. Такие числа и строки называют «магическими», потому что из контекста программы может быть не очевидно, что они значат, и почему они именно такие. Вместо них, как правило, используются именованные константы. Но в JavaScript нету констант. Поэтому приходится использовать переменные. Так, вместо того, чтобы присвоить innerHTML три точки, здесь этим трем точкам дано имя swf, что как бы подразумевает что в этом месте должен располагаться флеш объект. Это, пусть и не очень емкая, но хоть какая-то подсказка. Так в коде проще разобраться. А если одно и то же значение в коде используется несколько раз, то тогда уж тем более лучше его переменной присвоить. В случае с JavaScript, есть и еще одна причина. К JS коду часто применяют минификацию, чтобы сделать код компактней. При этом минификатор работает по определенному алгоритму, и часто код пишется так, чтобы минификатор его наиболее оптимально обработал. Если написать код, в котором неоднократно используется одно и то же значение, то минификатор никак не сможет его сжать, а если присвоить это значение переменной, и потом использовать ее, то даже если имя переменной длинное и информативное, минификатор может просто изменить его на одну букву, если эта переменная локальная. В связи со всем этим, и может чем-то еще, во многих программистских коллективах существуют соглашения по написанию кода, часто они есть не только на словах, но даже в виде документа. Это особенно важно при совместной работе над одним проектом нескольких человек. Данный, на вид избыточный код может быть следствием такого соглашения.
В данном случае этот код может казаться избыточным, но во-первых если уж разработчик придерживается определенного стиля или тем более соглашения, то лучше придерживаться его во всем, даже когда это кажется излишним, во-вторых любая функция в дальнейшем может быть модифицирована, дополнена, и лучше изначально писать код с запасом на будущее.
Cryvage, а запускать-то функцию кто будет?
Объясните пожалуйста, кто-нибудь, как может typeof == ‘source’ ?
Это рабочая, рекурсивная функция для клонирования объектов, но не понимаю, откуда ‘source’, даже учитывая == вместо ===
А эта функция и не работает. Попробуйте выполнить вот этот код:
Из него можно понять, что внутненний объект не клонируется. А проблема, видимо, в том, что агрумент функции был переименован из object в source, что повело за собой и замену строки «object» на «source».
Таким образом правильный вариант такой:
Как-то Вы странно объясняете .
«typeof source[i] == ‘object'» — это и ежу понятно что нет такого типа как «source», тогда зачем парить народ, приводя в начале нерабочий вариант, а потом раскрывать суть?
Может стоит сразу писать правильно, но тогда пропадает сама «суть» и мы приходим к выводу, что так делать не стоит.
Чет я с просони неправильно понял и потерялся в дискуссии. Так что извиняюсь.
В общем, претензии отзываются, но все просто как я и говорил выше — нет такого типа как «source» и все правильно — имелся ввиду «object», но все-равно непонятно — какого черта там «source»?!
А как проверить на существование такого объекта:
config.showcase.timer
Следующая запись вызывает ошибку:
if(window.config.showcase.timer === undefined)
В таком случае употребление typeof не поможет, выдаст такую же ошибку, по причине того, что config не был определён.
Убеждаемся в этом:
Правильный код (как я считаю):
Смысл этого кода в том, что нужно проверить существует ли основной (родительский объект), а потом проверять вложенные свойства.
Ведь, всё это нужно, чтобы наш код не вернул ошибку. Этот код и обходит эту ошибку.