Проверка типов значений
Строки
isEmptyString
Возвращает true тогда и только тогда, когда значением параметра является пустая строка, в противном случае возвращает false.
Ничего особенного, но данная функция может быть востребована при разработке других Stylus-функций и примесей. Данная функция даже пригодилась при реализации другой проверяющий значения функции — isDimensionlessQuantity:
isDimensionlessQuantity(value)
return typeof(value) == "unit" && isEmptyString(unit(value))
isNonEmptyString
Возвращает true тогда и только тогда, когда значением параметра является непустая строка, в противном случае возвращает false.
isNonEmptyString(X) — не то же самое, что !isEmptyString(X): в первом случае true будет возвращено только при непустой строке, во втором — также при нестроковых значениях.Распространено также использование !isNonEmptyString(X) — хотя двойное отрицание (включая частицу «non») трудно для восприятия, отсеивание всего, кроме непустых строк востребовано на практике.
isString
Возвращает true, если значением параметра является строка (пустая или же нет), в противном случае возвращает false. Более короткий вариант typeof(value) == "string".
Величины
В отличие от большинства языков программирования Stylus, будучи CSS-препроцессором, оперирует не просто с числами, а с величинами — размерными («dimensional quantity») или же безразмерными («dimensionless quantity»). Для обоих типов величин typeof() вернёт "unit", потому когда наличие или отсутствие размерности критично, потребуется дополнительная проверка. Для подобных целей среди приведённых ниже функций есть isDimensionalQuantity и isDimensionlessQuantity, а isDimensionalOrDimensionlessQuantity хотя и является эквивалентом typeof(x) == "unit", имеет имя, из прямого перевода которого чётко понятно, что true будет возвращено как для размерных величин, так и безразмерных величин.
isDimensionalOrDimensionlessQuantity
Возвращает true тогда и только тогда, когда значением параметра является размерная или безразмерная величина, в противном случае возвращает false. Работает так же, как и typeof(value) == "unit", и хотя имеет длинное имя, разрешает неоднозначность по поводу того, на размерную или безразмерную величину осуществляется проверка (в данном случае на обе).
log(isDimensionalOrDimensionlessQuantity(2px)) // true
log(isDimensionalOrDimensionlessQuantity(2)) // true
isDimensionalQuantity
Возвращает true тогда и только тогда, когда значением параметра является размерная величина, в противном случае возвращает false, при этом необходимо указать через второй параметр, считать ли 0 размерной величиной. Как известно из основ CSS, этот язык описания стилей позволяет опускать единицы изменения, если величина равна 0 (другими словами, 0 эквивалентен 0px, 0rem и сочетаниям 0 с любым другими единицами измерения, поддерживаемыми на данный момент в CSS).
isDimensionalQuantity(2px, "MUST_CONSIDER_DIMENSIONLESS_ZERO_AS_DIMENSIONAL_QUANTITY") // true
isDimensionalQuantity(2, "MUST_CONSIDER_DIMENSIONLESS_ZERO_AS_DIMENSIONAL_QUANTITY") // false
isDimensionalQuantity(0, "MUST_CONSIDER_DIMENSIONLESS_ZERO_AS_DIMENSIONAL_QUANTITY") // true
isDimensionalQuantity(0, "MUST_NOT_CONSIDER_DIMENSIONLESS_ZERO_AS_DIMENSIONAL_QUANTITY") // false
В примере выше через первый параметр переданы фиксированные значения, но на практике в большинстве случаев значение будет динамическое, то есть неизвестным заранее, чем и объясняется обязательность второго параметра.
isDimensionlessQuantity
Возвращает true, если значением параметра является безразмерная величина, в противном случае возвращает false, при этом 0 всегда считается безразмерным.
isDimensionlessQuantity(2px) // false
isDimensionlessQuantity(2) // true
isDimensionlessQuantity(0) // true
isNaturalNumber
Возвращает true тогда и только тогда когда значением параметра является безразмерная величина, представляющая собой натуральное число.
p(isNaturalNumber(1)) // true
p(isNaturalNumber(0)) // false
p(isNaturalNumber(1.1)) // false
p(isNaturalNumber(1e+1)) // false
p(isNaturalNumber(-1)) // false
Булевские значения
Будучи языком, не имеющим встроенную безопасность типов, Stylus имеет автоматическое приведение небулевских значений к булевским (например, в условных выражениях). Однако поведение Stylus иногда отличается от JavaScript-подобного, к которому привыкли веб-программисты. Например, проверка if someVariable даст результат true (в языке Stylus) даже если переменная someVariable не инициализирована.
definedVariable = true
if definedVariable
p("Очевидно, это будет выведено в консоль.")
if undefinedVariable
p("Это тоже будет выведено в консоль, потому что 'typeof(undefinedVariable)' будет 'ident', а это не приводится к false.")
Для того, чтобы избежать неожиданных багов, рекомендуется сравнивать в явном виде someVariable == true или someVariable == false, но isTrue(someVariable) и isFalse(someVariable), предлагаемые данной библиотекой — альтернативы.
isBoolean
Короткая альтернатива сравнительного выражения typeof(x) == "boolean", где x — произвольная переменная, пусть даже не объявленная.
isFalse
Альтернатива сравнительного выражения x == false, где x — произвольная переменная, пусть даже не объявленная.
isTrue
Альтернатива сравнительного выражения x == true, где x — произвольная переменная, пусть даже не объявленная.
Пустые значения
В Stylus имеются недоработки, связанные с пустыми значениями (null). Эта группа функций даёт больший уровень безопасности при работе с такими значениями. Если Вам нужна более конкретная информация, то данная тема разобрана в теоретически справке ниже.
Теоретический минимум: пустые значения в Stylus
Ключевое слово `null`
Рассмотрим следующий код:
sample1 = null
p(sample1)
p(typeof(sample1))
p(sample1 == null)
p(typeof(sample1) == "null")
Пока что Stylus работает как ожидалось:
inspect: null inspect: 'null' inspect: true inspect: true
Несуществующее свойство объекта
Рассмотрим следующий код:
sample1 = null
p(sample1)
p(typeof(sample1))
p(sample1 == null)
p(typeof(sample1) == "null")
Пока что №[+ImportantEntity--YDID Stylus] работает как ожидалось:
inspect: null inspect: 'null' inspect: true inspect: true
Функция или примесь только с остаточными параметрами
Рассмотрим следующий код:
sampleFunction1(parameters...)
sample3 = parameters
p(sample3)
p(typeof(sample3))
p(sample3 == null)
p(typeof(sample3) == "null")
sampleFunction1()
Здесь начинаются аномалии. Хотя выражение sample3 == null ложно, выражение typeof(sample3) == "null" правдиво:
inspect: () inspect: 'null' inspect: false inspect: true
Функция или примесь с остаточными параметрами на неначальной позиции
Рассмотрим следующий код:
sampleFunction2(parameter, restParameters...)
sample4 = restParameters
p("Checkpoint1")
p(sample4)
p("Checkpoint2")
p(typeof(sample4))
p(sample4 == null)
p(typeof(sample4) == "null")
sampleFunction2("TEST")
Имеет имеем следующий вывод в консоль:
inspect: "Checkpoint1" inspect: "Checkpoint2" inspect: 'null' inspect: false inspect: true
Здесь мы можем видеть следующие аномалии:
p(sample4)проигнорировано.- Хотя
typeof(sample4) == "null"правдиво,sample4 == nullпри этом ложно.
Из проведённых выше экспериментов можно сделать вывод, что прямое сравнение с null небезопасно. Вместо этого, следует сравнивать явно с помощью typeof(x) == "null" или typeof(x) == "null", но предлагаемые YDF функции isNull/isNotNull являются более короткими альтернативами.
isNotNull
Возвращает true при любых значениях параметра кроме null, а при null возвращает false. Не является эквивалентом x != null, потому что, как было показано выше, прямое сравнение с null работает не всегда как ожидается
isNull
Возвращает true тогда и только тогда когда значением параметра является null, а при любых других значениях — false. Не является эквивалентом x != null, потому что, как было показано выше, прямое сравнение с null работает не всегда как ожидается
Другие
isCalcExpression
Возвращает true тогда и только тогда, когда переданный параметр представляет собой Stylus-литерал (удовлетворяет условию typeof(value) == "literal"), при этом начинается с calc(, в остальных случаях возвращает false. Хотя отдельного типа данных для calc-выражений в Stylus нет, проанализировать, является ли литерал calc-выражением можно, что данная функция и делает.
isFunction
Возвращает true тогда и только тогда, когда переданный параметр является функцией, в остальных случаях возвращает false. Короткая альтернатива typeof(x) == "function".
isIdentifier
Возвращает true тогда и только тогда, когда переданный параметр является Stylus-идентификатором, в остальных случаях возвращает false. Эквивалент typeof(x) == "ident".
isObject
Возвращает true тогда и только тогда, когда переданный параметр является объектом, в остальных случаях возвращает false. Короткая альтернатива typeof(x) == "object".