Как вы уже знаете, переменные в Thunkable X за время своего существования могут принимать данные разных типов. Сначала к её блоку можно присоединить числовой блок, затем текстовой и т.д. Но внутренние механизмы работы приложений на устройствах требуют того, чтобы им были переданы данные определённого типа. В противном случае приложение может даже потерпеть крах. Ядро Thunkable X, казалось бы, должно иметь надёжную защиту от использования данных неподходящего типа, но на практике встречаются комбинации блоков, когда она не работает. Для повышения надёжности и стабильности работы приложений наряду с типами данных необходимо понимать то, как, кем и для чего производится преобразование типов данных
Смотрите пример ”Type conversion”.
В практических задачах необходимость преобразования значения из одного типа данных в другой встречается постоянно. Например, блок сложения не позволит использовать блоки строк для выполнения операции “100$” + “20$”. Для выполнения данной операции эти строки необходимо преобразовать в числовой тип и сложить их как 100 + 20.
Преобразование типов в Thunkable X может происходить автоматически (неявно) или вручную (явно).
Автоматическое преобразование происходит, например, в случае присоединения числового блока к блоку установки текста кнопки или присоединение блока получения надписи на кнопке в математическую операцию. Однако, логический блок false присоединить к текстовому входу уже не получится. Для осуществления этой операции вначале блок false необходимо присоединить к блоку переменной, а затем данный блок переменной к текстовому входу. Запомните этот приём:
если невозможно присоединить два блока друг к другу, то используйте вспомогательный блок переменной
У начинающего пользователя может возникнуть вопрос, для чего производится автоматическое преобразование типов? Это же вносит путаницу: записал значение одного типа, а получил значение другого типа! Ответ может удивить - для удобства программирования. Предположим, автоматического преобразования типов нет. В этом случае разработчику придётся каждый раз вручную использовать блоки для преобразования данных из одного типа в другой, что потребует много лишней работы. Например, для вывода данных на экран они должна быть преобразованы в строковый тип для чего каждый раз придётся использовать блок join или какой-то ещё.
Преобразование в число
Для преобразования в число можно использовать любой подходящий блок математической операции. Я предпочитаю использовать блок сложения с нулём.
Если строка начинается с цифр, то она автоматически преобразуется к числу, в противном случае возникнет значение ошибки NaN (не число):
“10$” в 10
“0.1degree” в 0.1
“age34” в NaN
"" в NaN или 0
При использовании пустой строки в математической операции её результатом будет NaN, а при использовании в математической функции - 0. Поэтому cos("") = 1. При использовании математической операции не происходит автоматического преобразование в число, а при использовании математической функции вначале аргумент преобразуется в число, а затем над ним будет выполнено действие. Перед выполнением математической функции со строковым аргументом необходимо проверять аргумент на неравенство пустой строке.
При использовании значений оставшихся типов в блоках математических операций будет получено значение NaN за исключением массива, если его первый элемент является числом или строкой, которую можно преобразовать в число. В этом случае для выполнения математической операции будет выбран первый элемент массива.
Для преобразования значений разных типов можно использовать математический блок "absolute"
y < ""
x < absolute < y // x = 0
y < [ 3 >
2 ]
x < absolute < y // x = 1
y <
null
x < absolute < y // x = 0
y <
undefined
x < absolute < y // x = NaN
y <
empty list
x < absolute < y // x = 0
y <
create object
x < absolute < y // x = NaN
пустая строка, null и пустой массив преобразуется в 0, а undefined и пустой объект - в NaN.
Преобразование в строку
Для преобразования значения в строку используется блок join. При этом:
Преобразование в логический тип
Для преобразования в логический тип используется последовательность из двух блоков not.
Автоматическое преобразование различных значений в булев тип позволяет упростить алгоритм, уменьшить количество блоков и сделать его более понятным. Например, нет необходимости использовать блок сравнения значения переменной с 0, пустой строкой или null. Вместо блока if < var var = 0, который будет выполнен, еcли значение этого выражения равно true, можно использовать блоки if < not < var.
Преобразование в объект
Преобразовать в объект можно только строку в корректном формате JSON. Для этого используется соответствующий блок. Если вам нужно преобразовать JSON в объект, то вначале убедитесь в том, что JSON составлен корректно. В Интернете можно найти много страниц для проверки этого.
Преобразование в массив
Преобразовать в массив можно текст с разделителями или строку в корректном формате JSON. В последнем случае массив будет содержать объекты. Для выполнения этих преобразований предназначены специальные блоки.
Преобразования данных в undefined и null не производят, поскольку эти типы представляют собой специальные значения.
Операции сравнения
Для выполнения операция сравнения используются блоки >, >=, <, <=, =, ≠. Использовать эти операции несложно, но при этом нужно быть очень внимательным, так как при использовании этих операторов происходит преобразование типов, в результате которого можно получить неожиданный результат.
Логическое значение true преобразуется в 1, а false – в 0.
false = 0 // true
true > false // true (1 > 0)
Если оба операнда не являются строками, то они преобразуются к числу. Если оба операнда яляются строками, то преобразование их к числу не происходит и они сравниваются как строки:
“9” < 20 // true
”1” = true // true
“9” > “100” // здесь сравниваются строки (преобразования к числам не происходит)
Если преобразовать строку в число невозможно, то операция преобразования вернёт значение NaN, которое при любых сравнениях возвращает false:
“Test” = 10 // false
NaN = NaN // false
NaN ≠ NaN // false
Сравнение чисел происходит путём сравнения их значений:
100 > 10 // true
-5 < -4 // true
При сравнении строк учитывает порядок символов в таблице символов Юникода:
“б” > a // true
z < t // false
Tes < Tet // true
Hello > Hell // true (более длинная строка больше)
Если операнды имеют разный тип, то желательно явным образом преобразовать их к одному типу.
Для проверки значения выражения на равенство NaN необходимо это выражение приобразовать к строке, которую затем сравнить со строкой “NaN”.
При сравнении с null и undefined нужно быть особенно внимательным.
undefined = null // true, это специальное правило: данные значения равны друг другу, и не равны больше никакому другому значению, кроме себя:
undefined = undefined // true
null = null // true
null = 0 // false
undefined = “” // false
При использовании операторов сравнения >, >=, <, <= с математическим операндом, значение null преобразуется к 0:
null > 0 // false (null преобразуется к 0)
null = 0 // false (преобразования к 0 не происходит, работает специальное правило)
null >= 0 // true (null преобразуется к 0)
При использовании операторов сравнения >, >=, <, <= с математическим операндом, значение undefined преобразуется к NaN, поэтому:
undefined > 0 // false (undefined преобразуется в NaN)
)
undefined < 0 // false (undefined преобразуется в NaN)
undefined = 0 // false (работает специальное правило)