Вызов typeof возвращает строку, содержащую информацию о типе операнда.
Оператор typeof используется в двух формах:
- typeof operand
- typeof (operand)
Эти формы идентичны: можно использовать скобки, а можно и не использовать - работает одинаково.
Оператор возвращает тип в виде строки, например:
var a = 5
alert(typeof a) // "number"
var a = 'test'
alert(typeof a) // "string"
Тип typeof возвращается, исходя из следующей таблицы соответствия типам javascript:
| Тип |
Результат |
| Undefined |
"undefined" |
| Null |
"object" |
| Boolean |
"boolean" |
| Number |
"number" |
| String |
"string" |
| Function |
"function" |
| Любой другой объект |
"object" |
Часто возникают вопросы - почему и зачем таблица именно такая? Ответ простой: потому что так получилось по ходу развития javascript.
В старом javascript-коде можно увидеть применение typeof для проверки существования переменной:
if (typeof(var) == "undefined") { ... }
В современном javascript лучше писать:
if (window.var !== undefined) { ... }
или, зачастую, подойдет и просто:
if (window.var) { ... }
P.S. Использовать просто if(var) нельзя, так как доступ к неопределенной переменной вызовет ошибку. Ну а обращение к отсутствующему свойству глобального объекта window всего лишь вернет undefined
Кроме того, оператор typeof используется для полиморфизма. Например, следующая функция получает узел DOM или ID узла и в обоих случаях корректно прячет узел.
function hideNode(node) {
if (typeof node == 'string') {
node = document.getElementById(node)
}
node.style.display = 'none'
}
Автор: Vladimir_O, дата: 27 ноября, 2009 - 16:09
#permalink>>можно писать:
if (window.var !== undefined) { ... }Думаю что так писать не стоит. Вот пример, когда этот метод не сработает:
undefined = 1; // Вот взяли и определили переменную, //... и она теперь совсем не 'undefined' if (window.var !== undefined) { ... }Автор: Гость (не зарегистрирован), дата: 7 декабря, 2009 - 19:49
#permalinkКак то вы объясняете плохо. Пока в другом месте не нашел непонятно.
Операция 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"
Автор: Dmitry A. Soshnikov, дата: 13 декабря, 2009 - 12:40
Вообще, по смысловой нагрузке, проверка существования переменной в объекте переменных, либо, что эта переменная имеет значение undefined, может быть осуществлена либо через:
либо (в глобальной области) с помощью оператора in:
Опять же, проверка с typeof позволяет проверить наличие переменной и во вложенном контексте (например, в функции), чего нельзя сделать при помощи window.var или window.var !== undefined. Более того, в предпоследнем случае, объект может иметь значение false, что полностью меняет смысл проверки.
Поэтому, typeof вполне себе используется в современном ES.
Автор: agentcoba (не зарегистрирован), дата: 2 января, 2010 - 22:57
#permalinkА если я хочу проверить является ли переменная именно целым числом, то никак?? что мне, циклом разбивать его и проверять каждый символ? //
Автор: Arm (не зарегистрирован), дата: 21 мая, 2010 - 08:55
#permalinkкомментаторов выше в топку.
type==undefined работает далеко не всегда, особенно в ИЕ.
не приходилось видеть сообщение undefined is undefined? ))
приходится использовать конструкцию
if (typeof myvar == 'undefined' || typeof myvar=='null' || typeof myvar=='unknown') {
Автор: _JoHn_ (не зарегистрирован), дата: 15 февраля, 2011 - 01:28
#permalinkNumber.MIN_VALUE > 0; // true or false?
typeof null; // what type?
null === Object; // true or false?
// и самый сок
NaN === NaN; // true or false?
typeof NaN; // what type?
Автор: _JoHn_ (не зарегистрирован), дата: 15 февраля, 2011 - 01:30
#permalinkNumber.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.
*/
Автор: xpostman (не зарегистрирован), дата: 18 апреля, 2011 - 19:15
#permalinkопасный способ. всё время нужно думать о том, что var может быть определена, но кастоваться в false. имхо, это стоит добавить в статью.
Автор: Гость (не зарегистрирован), дата: 24 июня, 2012 - 15:52
#permalinkа мне прикольно typeof() использовать
Автор: Dzmitry Vl.Bondar (не зарегистрирован), дата: 13 июля, 2012 - 15:40
#permalinkПо поводу 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;
Автор: Vitaly Sharovatov, дата: 4 октября, 2012 - 17:29
а что, если 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".
------------
Автор: N. (не зарегистрирован), дата: 19 октября, 2012 - 03:44
#permalinkНа сайте youtube.com код
var yt = yt || {}вызывается в глобальной области видимости. Почему это работает (если это работает)? yt проверяется без window и код на этом должен прекратить выполняться.
И для чего используется
(function () { var swf = '...'; document.getElementById('watch-player').innerHTML = swf; }) ()вместо
document.getElementById('watch-player').innerHTML = '...'?
Автор: Гость (не зарегистрирован), дата: 8 июля, 2013 - 08:48
#permalinkCryvage, а запускать-то функцию кто будет?
Автор: Kella (не зарегистрирован), дата: 22 ноября, 2013 - 00:12
#permalinkОбъясните пожалуйста, кто-нибудь, как может typeof == 'source' ?
function cloneObject(source) { for (i in source) { if (typeof source[i] == 'source') { this[i] = new cloneObject(source[i]); } else{ this[i] = source[i]; } } } var obj1= {bla:'blabla',foo:'foofoo',etc:'etc'}; var obj2= new cloneObject(obj1);Это рабочая, рекурсивная функция для клонирования объектов, но не понимаю, откуда 'source', даже учитывая == вместо ===
Автор: memelay1 (не зарегистрирован), дата: 15 июля, 2014 - 22:25
#permalinkА как проверить на существование такого объекта:
config.showcase.timer
Следующая запись вызывает ошибку:
if(window.config.showcase.timer === undefined)
Автор: Гость (не зарегистрирован), дата: 6 июля, 2019 - 09:40
#permalinkПочему ответ - number?
Автор: Kurs 1 USD (не зарегистрирован), дата: 23 октября, 2024 - 12:54
#permalinkОператор typeof возвращает строку, указывающую тип операнда. Он может использоваться в двух формах:
typeof operand
typeof (operand)
Обе формы эквивалентны: использование скобок необязательно, и результат будет одинаковым.