GrabDuck

Базовые типы: Строки, Числа, Boolean

:

В этой статье собраны особенности базовых типов данных, которые важны для программистов из других областей.

В Javascript есть и объектные типы данных и элементарные, которые можно интерпретировать как объекты.

Элементарные - создаются простым указанием данных:

var orange = "Апельсин"

Объектные - например, через оператор new:

var orange = new String("Апельсин")

На практике, хотя для каждого элементарного типа есть соответствующий объект, использовать их не рекомендуется. Это - отмершая часть языка.

var ok = new Boolean(true) // не надо

Элементарные типы автоматически интерпретируются как объекты при вызовах методов, поэтому можно, определять длину строки как:

alert("Апельсин".length)

Поэтому иногда говорят, что в javascript - все объекты. Так удобно думать, но определенная разница все же есть.

Например, typeof выдаст разный результат:

alert(typeof "test")
alert(typeof new String("test"))

Это - еще одна причина избегать использования объектов там, где существует элементарный тип: меньше путаницы.

Преобразование типа можно явным образом сделать через его название:

var test = Boolean("something") // true

Кроме всем известных типов данных - в javascript есть специальное значение undefined, которое, условно говоря, обозначает что "данных нет". Не null, а данных нет. Понимайте как хотите.

Далее рассмотрим особенности каждого из этих типов.

Все числа хранятся в формате float64, т.е 8 байт с плавающей точкой. В этом формате не всегда возможны точные вычисления.

Например,

alert(0.1+0.2)  // выведет не 0.3!

При операциях с Number - никогда не происходят ошибки. Зато могут быть возвращены специальные значения:

1/0
Number.POSITIVE_INFINITY (плюс бесконечность)
-1/0
Number.NEGATIVE_INFINITY (минус бесконечность)
Number(“something”)
NaN (Not-a-Number, результат ошибочной операции)

Бесконечность бывает полезно использовать в обычном коде. Например, положительная бесконечность Number.POSITIVE_INFINITY больше любого Number, и даже больше самой себя.

NaN - особый результат.

  • Любая математическая операция с NaN дает NaN:
  • NaN не равен сам себе:
  • Можно проверить с помощью функции isNaN:

Для этого используется метод toFixed.

0.1234.toFixed(2)  = 0.12

Стандартно конвертация осуществляется вызовом Number(). Можно и попроще: +str.

// эквивалентные записи
var str = "002"
var a = Number(str) // 2
// нечисла превращаются в NaN
+"0.1"  // => 0.1
+"0.1z" // => Number.NaN

Кроме жесткой конвертации есть и более мягкая фильтрация в число:

// обрезается все после числа
parseFloat("0.1zf") = 0.1
parseInt("08f.4", 10) = 8
// тут числа вообще нет, поэтому NaN
parseFloat("smth") = Number.NaN

parseFloat , parseInt переводят слева направо, пока это возможно. Если вообще невозможно - то NaN.

Второй аргумент parseInt - основание системы счисления. Если его нет, то система сама пытается угадать систему счисления:

parseInt("0x10") = 16 // т.к 0x обозначает 16-ричную систему
parseInt("010") = 8 // т.к ведущий 0 обозначает 8-ричную систему
// если хотите без сюрпризов - указывайте основание явно
parseInt("010",10) = 10

Все математические функции находятся в "пакете" Math. Не то, чтобы в javascript есть реальные пакеты, просто так получилось.

  • Math.floor() / Math.round() / Math.ceil() - округление
  • Math.abs() - модуль числа
  • Math.sin() и т.д

Строки в javascript - полностью юникодные.

  • Кавычки двойные и одинарные работают одинаково
  • Можно указывать юникодные символы через \uXXXX:
  • Встроены регулярные выражения, методы replace/match:
    • "превед медвед".replace(/(.*?)\s(.*)/, "$2, $1!") // => медвед, превед!

Как это обычно и бывает, в регулярках символ \w обозначает латинские буквоцифры или подчеркивание, но не русские буквы.

Длина строки хранится в свойстве length.

В javascript - особый список значений, которые при приведении к Boolean становятся false. Он отличается, например, от аналогичного списка в PHP.

False
false
null
undefined
“”
0
Number.NaN
True – все остальное
“0”
“false”

Чтобы привести значение к булевому - используется либо явное указание типа: Boolean(a), либо двойное отрицание: !!a

Boolean(a) == !!a