Глава 3.3. Типы данных

3.3.1. Описание типов данных

Язык JavaScript содержит шесть типов данных: Undefined (неопределенный), Null (нулевой), Boolean (логический), String (строковый), Number (числовый) и Object (объектный). Это относительно небольшое количество типов позволяет, тем не менее, создавать полноценные сценарии для выполнения многих функций.

3.3.1.1. Тип Undefined (неопределенный)

Этот тип состоит из единственного значения undefined. Это значение, которое принимает переменная, которая объявлена в программе, но которой еще не присвоено никакого значения.

3.3.1.2. Тип Null (нулевой)

Этот тип состоит из единственного значения null. Это значение означает нулевую, пустую или несуществующую ссылку.

3.3.1.3. Тип Boolean (логический)

Этот тип состоит ровно из двух логических значений: true (истина) и false (ложь).

3.3.1.4. Тип String (строковый)

Этот тип состоит из всех возможных текстовых строк. Каждая строка представляет собой упорядоченный массив из нуля или более символов Unicode (т. е. 16-битовых целых чисел без знака), называемых элементами строки. Элементы строки нумеруются, начиная с нуля. Длина строки — это количество элементов в ней; пустая строка состоит из нуля элементов.

3.3.1.5. Тип Number (числовой)

Этот тип имеет ровно 18437736874454810627 (т. е. 264 - 253 + 3) значений, соответствующих 64-битовому формату плавающих чисел двойной точности IEEE 754 с тем единственным исключением, что 9007199254740990 (т. е. 253 - 2) различных значений "Не число" данного формата представляются в JavaScript одним значением NaN.

Еще два специальных значения — это положительная бесконечность и отрицательная бесконечность, которым в JavaScript соответствуют выражения +Infinity (или просто Inifinity) и -Infinity. Отметим также, что в данном формате различаются положительный нуль (+0 или 0) и отрицательный нуль (-0).

3.3.1.6. Тип Object (объектный)

Значением этого типа являются объекты. Объект — это неупорядоченный набор свойств, который подробно описан в разделе 3.7.1.

3.3.2. Преобразование типов

JavaScript — слаботипизированный язык. Это означает, что в декларации переменной мы не указываем ее тип и в дальнейшем можем присваивать ей значения любых типов. Исполняющая система JavaScript сама выполняет автоматическое преобразование типов данных по мере необходимости. Для явного преобразования типов используются методы Boolean, Number, Object и String.

Преобразования типов происходят по следующим правилам.

3.3.2.1. Преобразование к логическому типу

Исходный тип Результат
Undefined false
Null false
Boolean без изменений
Number false, если аргумент равен +0, -0 или NaN; true в остальных случаях
String false, если аргумент — пустая строка; true в остальных случаях
Object true

3.3.2.2. Преобразование к числовому типу

Исходный тип Результат
Undefined NaN
Null +0
Boolean 1, если аргумент равен true, и 0, если аргумент равен false
Number без изменений
String если строка содержит правильное число (возможно с пробелами перед и/или после него), то это число; NaN в противном случае
Object результат преобразования значения объекта по умолчанию

3.3.2.3. Преобразование к строковому типу

Исходный тип Результат
Undefined "undefined"
Null "null"
Boolean "true", если аргумент равен true, и "false", если аргумент равен false
Number текстовое представление числа (см. ниже)
String без изменений
Object результат преобразования значения объекта по умолчанию

Преобразование числа n в строку происходит по следующим правилам:

  • если n равно NaN, то результат "NaN";
  • если n равно +0 или -0, то результат "0";
  • если n отрицательно, то результат будет конкатенацией строки "-" и результата преобразования в строку числа -n;
  • если n равно бесконечности, то результат "Infinity";
  • в остальных случаях пусть m, k и s — такие целые числа, что k >= 1, 10k-1 <= s < 10k, n равно s x 10m-k и k — наименьшее из возможных. Отметим, что k — это количество цифр в десятичном представлении s, что s не делится на 10 и что наименее значимая цифра s может не быть однозначно определенной. Тогда
  • если k <= m <= 21, то результат состоит из k десятичных цифр s (без ведущих нулей), за которыми следуют m-k символов '0';
  • иначе, если 0 < m <= 21, то результат состоит из m старших десятичных цифр s, за которыми следуют десятичная точка '.' и k-m оставшихся десятичных цифр s;
  • иначе, если -6 < m <= 0, то результат состоит из символа '0', за которым следуют десятичная точка '.', -m символов '0' и k десятичных цифр s;
  • иначе, если k = 1, то результат состоит из единственной цифры s, символа 'e', символа плюс '+' или минус '-' в зависимости от того, положительно или отрицательно m-1, за которыми следует десятичное представление числа abs(m-1);
  • иначе результат состоит из старшей десятичной цифры s, за которой следуют десятичная точка '.' и k-1 оставшихся десятичных цифр s, символ 'e', символ плюс '+' или минус '-' в зависимости от того, положительно или отрицательно m-1, за которыми следует десятичное представление числа abs(m-1).

3.3.2.4. Преобразование к объектному типу

Исходный тип Результат
Undefined генерируется исключение TypeError
Null генерируется исключение TypeError
Boolean новый логический объект с данным значением по умолчанию
Number новый числовой объект с данным значением по умолчанию
String новый строковый объект с данным значением по умолчанию
Object без изменений

3.3.2.5. Примеры неявных преобразований

В выражениях, соединяющих числовые и строковые значения операцией +, JavaScript преобразует числа в строки, например:

x = "Ответ равен " + 21  // возвращает "Ответ равен 21"
y = 21 + "  - вот ответ" // возвращает "21 - вот ответ"

В остальных случаях JavaScript пытается преобразовать строку в число, например:

a = "21" - 1 // возвращает 20
b = "21" + 1 // возвращает 211