Типы данных JavaScript

В этой главе:

  • Числа

  • Специальные числовые значения

  • Ошибки округления вещественных чисел

  • Строки

  • Конкатенация

  • Логические (булевы) значения

  • null и undefined

  • Присваивание по значению

  • Объекты обёртки

  • Неизменяемые простые значения

В процессе работы компьютерные программы манипулируют значениями, такими как число 7 или текcт "HelloWorld!". Каждое значение, которое может быть представлено и обработано в языке программирования относится к определённому типу данных. Тип данных определяет типы значений, которые используются в языке программирования.

Типы данных в JavaScript можно разделить на две категории: простые (их также называютпримитивные) типы и составные (объекты). К категории простых типов относятся:

  • String - текстовые строки (обычно их называют просто - строки)

  • Number - числа

  • Boolean - логические (булевы) значения

Так же к простым типам относятся два специальных значения:

  • null

  • undefined

К составным типам данных относятся:

  • Function - функции

  • Array - массивы

  • Object - объекты

Числа

Значениями числового типа являются числа.

1
2
3
4
7
12
9.3
.3   // если целая часть вещественного числа является нулём, её можно опустить

Для представления чисел в JavaScript используется 64-битный формат, определяемый стандартом IEEE 754. Этот формат способен представлять числа в диапазоне от 5e-324 до 1.7976931348623157e+308.

Все числа в JavaScript представляются вещественными значениями (с плавающей точкой), т.е. нет различий между целыми и вещественными значениями.

При использовании слишком длинных чисел их можно сокращать с помощью экспоненциальной записи. Для обозначения экспоненты используется буква "e", которая ставится сразу же после мантиссы и перед экспонентой. Например значение 3.52x105 (352 000), вместо всего, что находится между числом и экспонентой, нужно поставить букву "e", в результате предыдущую запись можно представить в таком виде:

1
var bigNumber = 3.52e5;

Любому числовому литералу может предшествовать знак минус (-), делающий число отрицательным.

1
var temperature = -20;

Числа можно указывать также в виде шестнадцатеричных значений. Шестнадцатеричное значение начинается с последовательности символов "0x", за которой следует само значение.

1
var num = 0xff;  // число 255

Специальные числовые значения

В JavaScript имеются предопределённые глобальные переменные Infinity и NaN. Переменная Infinity хранит специальное значение обозначающее бесконечность - Infinity, переменная NaN также хранит специальное значение NaN (NaN сокращение от англ. Not a Number - не число). По стандарту ECMAScript 5, эти переменные доступны только для чтения. Рассмотрим в каких случаях можно получить данные значения.

Значение бесконечности можно получить к примеру в результате деления числа на 0

1
alert(123 / 0); // Infinity

При делении отрицательного числа на 0, получится минус бесконечность -Infinity

1
alert(-12345 / 0); // -Infinity

Если результат арифметической операции окажется больше самого большого допустимого положительного значения, возвращается специальное значение Infinity. Аналогично, если абсолютное значение отрицательного результата окажется больше допустимого отрицательного значения, возвращается отрицательная бесконечность (-Infinity):

1
2
alert( 1e500 );     // Infinity
alert( 1 - 1e500 ); // -Infinity

Увидеть максимальное и минимальное допустимое число можно с помощью константNumber.MAX_VALUE и Number.MIN_VALUE соответственно.

1
2
document.write(Number.MAX_VALUE + "<br>");
document.write(Number.MIN_VALUE);

Значение NaN используется для обозначения математической ошибки, она возникает в том случае, если математическая операция не может быть совершена, например:

1
2
3
4
var a = 10, b = "текст";
 
document.write(a - b);  // математическая операция не с числовым аргументом
document.write(0 / 0);  // деление нуля на нуль

Попробовать »

Значение NaN обладает одной особенностью: операция проверки равенства всегда возвращает отрицательный результат, даже если сравнивать его с самим собой. Это значит, что нельзя использовать проверку x == NaN, чтобы определить, является ли значение переменной x значением NaN. Вместо этого следует выполнить проверку x != x. Эта проверка вернет true тогда и только тогда, когда x имеет значение NaN. Аналогичную проверку можно выполнить с помощью функции isNaN(). Она возвращает true, если аргумент имеет значение NaN или если аргумент является нечисловым значением, таким как строка или объект.

1
2
3
4
var x = NaN;
 
document.write(x != x, "<br>");  // true
document.write(isNaN(x));              // true

Ошибки округления вещественных чисел

Двоичное представление вещественных чисел неспособно обеспечить точное представление таких простых чисел как 0.1. Двоичное представление вещественных чисел в JavaScript определяется согласно стандарту IEEE-754, в этом стандарте уделено особое внимание двоичной арифметике чисел с плавающей точкой.

Точность представления вещественных чисел в JavaScript достаточно высока и позволяет обеспечить очень близкое представление вещественного числа. Но тот факт, что вещественное число не может быть представлено точно, может приводить к проблемам. Посмотрим на следующий пример:

1
2
3
4
5
6
var x = 0.3 - 0.2;
var y = 0.2 - 0.1;
 
document.write(x == y);    // false
document.write(x == 0.1);  // false
document.write(y == 0.1);  // true

Из-за ошибок округления разность между числами 0,3 и 0,2 оказалась не равной разности между числами 0,2 и 0,1. Важно понимать, что эта проблема не является чем-то характерным для JavaScript: она проявляется во всех языках программирования, где используется двоичное представление вещественных чисел. Стоит обратить внимание, что значения x и y в примере выше очень близки друг к другу и к истинному значению. Точность округления вполне приемлема для большинства применений: проблема возникает лишь при попытках проверить значения на равенство.

Строки

Значениями строкового типа являются текстовые строки. Они могут состоять из нуля и более символов. Символы включают в себя буквы, цифры, знаки пунктуации, специальные символы и пробелы. Строки должны быть заключены в двойные или одинарные кавычки (апострофы):

1
2
var myColor = "red";
var myColor = 'red';

Строки заключённые в двойные кавычки могут содержать символы одиночных кавычек и наоборот.

1
2
"одинарные 'кавычки' внутри двойных"
'здесь "наоборот" '

Для того, чтобы в строке, заключённой в двойные кавычки, можно было использовать двойные кавычки, нужно их экранировать с помощью обратного слэша (\), тоже самое касается и строки заключённой в одиночные кавычки:

1
2
document.write("внутри используются \"двойные\" кавычки");
document.write('внутри используются \'одиночные\' кавычки');

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

1
2
3
"это одна \
длинная \
строка"

Длина строки - это количество 16-битных значений, содержащихся в ней. Нумерация символов в строках начинается с нуля, т.е. первое 16-битное значение находится под индексом 0, второе - под индексом 1 и т.д. Для определения длины строки - количества 16-битных значений - используется свойство строки length:

1
2
var msg = "hello";
document.write(msg.length);

К отдельным символам строки можно обращаться с помощью индексов, заключённых в квадратные скобки:

1
2
var msg = "hello";
document.write(msg[1]);  // => "e"

В JavaScript строка - это неизменяемая, упорядоченная последовательность 16-битных значений, каждое из которых представляет символ Юникода. Для представления символов Юникода в JavaScript используется кодировка UTF-16. Большинство наиболее часто используемых символов Юникода имеют кодовые пункты, умещающиеся в 16 бит, и могут быть представлены единственным элементом строки. Символы Юникода, кодовые пункты которых не умещаются в 16 бит, кодируются в соответствии с правилами кодировки UTF-16 как последовательности из двух 16-битных значений. Это означает, что строка, имеющая длину, равную 2 (два 16-битных значения), может представлять единственный символ:

1
2
3
4
5
var p = "π"  // состоит из одного 16-битного значения
var e = "