Вызов 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'
}
>>можно писать:
if (window.var !== undefined) { ... }Думаю что так писать не стоит. Вот пример, когда этот метод не сработает:
undefined = 1; // Вот взяли и определили переменную, //... и она теперь совсем не 'undefined' if (window.var !== undefined) { ... }Никто в здравом уме не будет переопределять
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"
Вообще, по смысловой нагрузке, проверка существования переменной в объекте переменных, либо, что эта переменная имеет значение 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'?
Проверил, в ИЕ работает.
function Log(what) { if (typeof(console) == "object") console.log(what); } function Dir(what) { if (typeof(console) == "object") console.dir(what); }Это для отладки в Firefox Firebug. После отладки функции можно не закоментирововать и не удалять. Можна готовую работу заказщику отправлять.
Лучше так
new function () { var debug = true; var original = window.console; window.console = {}; ['log', 'dir', /* остальные методы */].forEach(function (method) { console[method] = function () { return (debug && original) ? original[method].apply(original, arguments), } }); };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, и что?
опасный способ. всё время нужно думать о том, что var может быть определена, но кастоваться в false. имхо, это стоит добавить в статью.
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.