JavaScript или JS (сокращенно) не простой язык и начинающие разработчики узнают об этом не сразу. По началу они узнают азы и все кажется красочным и прекрасным. Заходя чуть глубже, появляются JavaScript массивы, объекты, callback’и и все подобное, что часто выносит мозг.
В JavaScript важно правильно проверять тип переменной. Допустим вы хотите узнать является ли переменная массивом или объектом? Как это правильно проверить? В этом конкретном случае, есть хитрости во время проверки и именно о них будет эта запись. Давайте сразу приступим.
Проверка типа переменной
Например вам нужно проверить является переменная объектом, массивом, строкой или числом. Для этого можно использовать typeof , но она не всегда выдаст правду и в примере ниже я покажу почему.
Этот пример я написал, чтобы наглядно показать, почему typeof не всегда правильный выбор.
Var _comparison = { string: "строка", int: 99, float: 13.555, object: {hello: "привет"}, array: new Array(1, 2, 3) }; // Вернет массив с ключами объекта var _objKeys = Object.keys(_comparison); for(var i = 0; i <= _objKeys.length - 1; i++) { // выведем в консоль тип каждой переменной console.log(typeof _comparson[_objKeys[i]]); }
Результат выполнения кода:
String number number object object
Верно? — Нет, конечно. Есть две проблемы. Каждая из них будет подробно описана и предложено решение.
Первая проблема: float число, выводится как number
Comparison.float не является числом и вместо number должно быть float (число с плавающей точкой).Чтобы это исправить, можно создать функцию с проверкой как в коде ниже.
Var _floatNumber = 9.22; var _notFloatNumber = 9; console.log(isFloat(_floatNumber)); console.log(isFloat(_notFloatNumber)); console.log(isFloat("")); function isFloat(n){ return Number(n) === n && n % 1 !== 0; }
Функция isFloat() выполняет проверку всех значений на числа с плавающей точкой. Сначала проверяется равна ли переменная n числу (Number(n) === n) и если да, то делается еще одна проверка на деление с остатком и если остаток есть, то возвращается булевой (true или false ) результат (n % 1 !== 0).
В примере выше она возвращает true , false и false . Первое значение имеет float тип, второе нет — это обычное число и последнее всего лишь пустая строка, которая не подходит под правила.
Вторая проблема: массив определился как объект
В самом первом примере, массив отобразился как объект и это не очень хорошо, так как иногда вам нужно использоваться именно этот тип и ничего больше.
Есть несколько способов для проверки переменной на тип массива.
Первый вариант (хороший вариант). Проверяем принадлежность data к массиву с помощью instanceof ().
Var data = new Array("hello", "world"); var isArr = data instanceof Array;
Второй вариант (хороший вариант). Метод Array.isArray() возвращает булевое значение, которе будет зависеть от того является ли переменная массивом или нет ().
Var data = new Array("hello", "world"); var isArr = Array.isArray(data);
Третий вариант (самый лучший, но длинный). Для удобности, вы можете сделать этот способ функцией. Используя Object, мы делаем . Если результат Object.prototype.toString.call(data) не равен значит переменная не массив ().
Var data = new Array("hello", "world"); var isArr = Object.prototype.toString.call(data) == ""; console.log(isArr);
Последний результат в виде удобной функции:
Function isArray(data) { return Object.prototype.toString.call(data) == "" }
Теперь вы можете вызвать функции isArray() и как аргумент задать массив или что-то иное и посмотреть результат.
Послесловие
Запись получилась достаточно большой, чем изначально задумывалась. Но я ей доволен, потому что она достаточно кратко и четко описывает затруднения при проверке переменных в JavaScript и как их обойти.
Если у вас остались какие-либо вопросы — пишите их ниже к этому записи. Я буду рад помочь.
Определение типа переменной
Унарная операция typeof позволяет определить тип переменной, т. е. определить тип величины, хранящейся в данный момент в переменной. Синтаксис ее имеет вид:
typeof(переменная)
typeof переменная
Эта операция возвращает одну из шести строк, соответствующих возможным типам данных JavaScript:
Упражнения
1. Написать сценарий, который при загрузке страницы HTML в браузер методом document.write() формирует на странице элемент PRE и его содержимое в виде трех строк текста, в которых слова отделены символами табуляции. Это действие реализовать в одном вызове метода document.write().
2. Написать сценарий, который после загрузки страницы отображает в диалоговом окне, создаваемом функцией alert(), три строки сообщения.
3. Проверить соответствие булеву значению false значений 0, 00, 0.0, 0e1, null, undefined, +1, -1.1, "", "0", "undefined", "xxxx". Для этого создать переменные с указанными значениями и распечатать, например, функцией alert(), результат вычисления выражения!v, где v является идентификатором переменной с одним из указанных значений.
4. Написать сценарий, в котором одной и той же переменной присваиваются разные значение. После изменения значения переменной распечатать ее тип (результат выполнения операции typeof).
Урок 4. Выражения и операции
Выражение – это комбинация переменных, литералов и операций, в результате вычисления которой получается одно единственное значение.
Переменные в выражениях должны быть инициализированы либо в операторе var, либо оператором присваивания. Если при вычислении выражения встречается неинициализированная или вообще не определенная переменная, то в Internet Explorer версий меньше 6.0 интерпретатор генерирует ошибку "undefined variable" ("переменная не определена"), указывая ее местоположение на странице HTML. В Internet Explorer 6.0 ситуация с использованием в выражении неинициализированной переменной была приведена к стандарту - такая переменная, а с ней и все арифметическое выражение принимает значение NaN, трактуемое в булевом контексте как false, а в строковых операциях как строка "NaN", но при использовании необъявленной переменной интерпретатор генерирует ошибку "определение отсутствует".
Присваивание является операцией, которая не только присваивает левому операнду значение правого, но и вычисляется равным значению выражения правой части. Таким образом, любая конструкция с операцией присваивания рассматривается как выражение.
Кроме выражения присваивания в JavaScript определены еще три типа выражений:
· арифметическое - вычисляемым значением является число;
· строковое - вычисляемым значением является строка;
· логическое - вычисляемое значение равно true или false.
| | следующая лекция ==> | |
В языке VBA есть универсальные типы данных, т.е. способные хранить как число, так и строку, дату и любой другой тип информации. Например, ячейка в таблице может содержать что угодно и изначально, программа не знает какой в ней тип данных хранится. Кроме того, в самой программе может использоваться тип данных Variant, который так же может содержать любое значение любого типа.
Чтобы определить какой тип данных в ячейке или в переменной типа Variant, можно воспользоваться несколькими способами.
Способ 1. Использовать функцию TypeName для определения типа данных
Эта функция возвращает строку с названием типа данных на английском. В качестве аргумента принимает переменную, значение ячейки.
Обратите внимание:
Функция определяет только стандартные типы данных и не может определить пользовательский тип (определенный с помощью Type).
Возможные возвращаемые функцией значения:
Byte | Число типа Byte |
Integer | Целое число |
Long | Длинное целое число |
Single | Число одиночной точности с плавающей запятой |
Double | Число двойной точности с плавающей запятой |
Currency | Валюта |
Decimal | Число с плавающей запятой |
Date | Дата |
String | Строка |
Boolean | Логическое |
Error | Ошибка |
Empty | Не проинициализировано (т.е. переменная не была объявлена) |
Null | Неверные данные (в переменной нет корректных данных) |
Object | Объект (класс) |
Unknown | Тип данных не известен |
Nothing | Объект, никуда не ссылающийся |
Приведу несколько примеров по использованию TypeName.
Пример 1 . Определение типа переменной.
Dim v As Integer MsgBox TypeName(v) " Выведет: Integer
Обратите внимание: если вы используете результат TypeName в условии, т.е. проверяете, соответствует ли тип данных определенному, например, Integer, то регистр символов возвращаемого типа имеет значение. Т.е. нужно писать Integer с заглавной буквы, либо использовать приведение всех символов к одному регистру.
Пример 2 . Использование TypeName в условии.
Dim v As Integer If TypeName(v) = "Integer" Then MsgBox "Yes" Else MsgBox "No" " Yes If TypeName(v) = "integer" Then MsgBox "Yes" Else MsgBox "No" " No If LCase(TypeName(v)) = "integer" Then MsgBox "Yes" Else MsgBox "No" " Yes
Пример 3 . Определение типа данных в ячейке.
MsgBox TypeName(Cells(1, 1).Value) " Выведет тип данных в ячейке A1
Если функции была передана переменная массив, она вернет тип данных в массиве с добавлением скобок.
Пример 4 . Определение типа массива.
Dim Arr1(10) As Integer Dim Arr2(10) MsgBox TypeName(Arr1) " Выведет: Integer() MsgBox TypeName(Arr2) " Выведет: Variant()
Способ 2. Проверка на возможность преобразования строки к нужному типу.
Бывает ситуация, когда значение, например, число или дата, содержится в строке. В этом случае TypeName вернет String, а не Integer или Date. Чтобы узнать, что содержится в строке, можно воспользоваться одной из функций IsNumeric, IsDate, IsObject, IsArray, IsNull, IsError.
Пример 4 . Определение может ли переменная быть преобразована в число.
Dim v As String If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" " Выведет: no (т.к. в строке нет числа) v = "120" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" " Выведет: yes v = "120.45" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" " Выведет: no v = "test 120" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" " Выведет: no v = "120 test" If IsNumeric(v) Then MsgBox "yes" Else MsgBox "no" " Выведет: no
К сожалению, как видим из примера, нет возможности проверить, содержится ли в строке число с плавающей точкой.
Пример 5 . Определение содержит ли переменная дату (может быть преобразована в дату).
Dim firstDate, secondDate As Date Dim timeOnly, dateAndTime, noDate As String firstDate = CDate("12.05.2017") secondDate = #12/5/2017# timeOnly = "15:45" dateAndTime = "12.05.2017 15:45" noDate = "Test" If IsDate(firstDate) Then MsgBox "yes" Else MsgBox "no" " Выведет: yes If IsDate(secondDate) Then MsgBox "yes" Else MsgBox "no" " Выведет: yes If IsDate(timeOnly) Then MsgBox "yes" Else MsgBox "no" " Выведет: yes If IsDate(dateAndTime) Then MsgBox "yes" Else MsgBox "no" " Выведет: yes If IsDate(noDate) Then MsgBox "yes" Else MsgBox "no" " Выведет: no
Проверка, содержится ли число или дата в ячейке листа делается аналогично, как и с переменными.
Помимо этих способов можно конечно еще придумать и другие, например, проверку строки с данными регулярным выражением или пройти по каждому символу в цикле и проверить цифра это или нет и тому подобное. Но на мой взгляд, описанных мной способов вполне достаточно для решения повседневных задач.