Знания о типах данных очень важны для понимания языка программирования, хотя и могут показаться неподготовленному читателю скучными и далекими от практики. Тем не менее, новичкам следует мужественно перенести предлагаемое «испытание». Если после прочтения данной статьи у вас останутся белые пятна, то не отчаивайтесь и продвигайтесь далее. Вы всегда сможете вернуться обратно, чтобы уяснить ранее недопонятое и все поставить на свои места. Рассмотрим все возможные типы данных в языке программирования JavaScript.
Итак, данные в JavaScript, как и в любом другом языке программирования, относятся к тому или иному типу. Типы данных, в свою очередь, разделяют на примитивные и составные.
Примитивные типы содержат простые значения, с которыми мы встречаемся в повседневной жизни: числа, строки и логические значения вроде «Да» и «Нет». Так, с числами нам приходится оперировать не только при расчетах перед кассовым аппаратом в магазине, но и при решении более сложных математических задач. Строки содержат какие угодно символы. Семантика строки автоматически не определяется. Кто как не свободный отправитель должен вкладывать некий смысл в созданный им набор символов? Кто как не свободный получатель должен расшифровывать принятое сообщение?
Разумеется, кое-что можно сделать автоматически, опираясь на нечто общезначимое, понятное всем и всеми однозначно интерпретируемое. Именно так и происходит в действительности. Одно жестко и однозначно интерпретируется по определенным правилам в соответствии с общечеловеческой культурой, а другое «отдается на откуп» пользователю почти без ограничений. Сакраментальный вопрос всей жизни состоит в том, как сочетать свободу с необходимостью. В программировании он не эпизодически появляется, а присутствует постоянно, искушая и мотивируя программистов всех мастей.
Произвольные данные, без структуры и достаточно четко оформленных идей их дальнейшего употребления, программисту дозволено и рекомендуется оформлять в виде строк. В строке может находиться все, что угодно. Восприятие строк — дело пользователя, а не интерпретатора языка. Однако применительно к скриптовым (интерпретируемым, а не компилируемым) языкам последнее замечание не вполне точно. Интерпретируемые языки, такие как JavaScript и РНР, не «оставляют в покое» строки. Символьные последовательности, участвующие в выражениях с данными других типов, подвергаются автоматическому преобразованию к соответствующему, с точки зрения интерпретатора, типу.
Интерпретаторы этих языков пытаются «извлечь» некий смысл, который, возможно, пользователь или программист в них вложил. Например, встречаясь со строкой «25», содержащей число 25, интерпретатор JavaScript попытается привести его к тому или иному типу в зависимости от контекста. Для новичков эта поддержка их интуиции со стороны интерпретатора языка более чем кстати. Но для искушенных программистов, привыкших все держать под своим контролем, это просто «беспредел».
Однако я хочу указать всем, в том числе и профессионалам, что слабый контроль типов с автоматическим приведением к нужному в зависимости от конъюнктуры является очень интересной возможностью, ждущей своих почитателей, которые смогут написать изящные и эффективные коды, решающие не только близлежащие задачи сайтостроительства, но и далеко идущие проблемы, связанные, например, с искусственным интеллектом.
Строка, пусть даже содержащая одни только цифры, не является числом. Поэтому арифметические операции над строками, содержащими числа, могут привести к результатам, существенно отличным от тех, которые мы ожидаем в случае действий над самими числами.
Чтобы как-то определиться, мы должны признать, что число — объект, достаточно ясно определенный в математике, — в языке программирования представляется символически так или иначе. Строка — это набор произвольных символов, которую нельзя интерпретировать, например, как число, дату или что-либо другое. Над строками мы производим одни операции, а над числами — другие. Логическое значение — одно из двух возможных значений, которые обычно обозначаются как true (ИСТИНА) и false (ЛОЖЬ). Для работы с логическими значениями существует своя алгебра, отличная от арифметики. Мы можем сформулировать некое утверждение, которое в данном контексте может быть истинным или ложным. Для обозначения оценки истинности логического выражения в языках программирования предусмотрены специальные ключевые слова: true (истина) и false (ложь).
Составные типы данных, в отличие от примитивных, могут содержать разнородные данные, а также данные других составных типов. Типичный пример составного типа данных — массив. Массив в JavaScript — это упорядоченный набор данных (называемых элементами), каждое из которых принадлежит к тому или иному типу. Место каждого элемента в массиве фиксировано, а потому доступ к ним возможен по порядковому номеру (индексу). Объект — еще один составной тип данных, причем настолько общий, что позволяет представить все другие составные типы данных, такие как массивы, даты, функции и даже объекты. В объекте данные не обязаны быть упорядоченными, как в массиве.

Примитивные типы данных

В JavaScript имеются пять примитивных типов данных:
1. Строковый или символьный (String) используют, чтобы задать последовательность символов, в том числе и пустая, заключенная в кавычки, двойные или одинарные.
2. Числовой (Number) позволяет задать десятичное число, представленное в виде последовательности цифр, перед которой может быть указан знак числа {+ или -);
— перед положительными числами не обязательно ставить знак + ;
— целая и дробная части чисел разделяются точкой. Возможно представление в экспоненциальной, шестнадцатеричной и восьмеричной формах. Числа записываются без кавычек.
3. Логический (булевский, Boolean).
Этот тип данных имеет два значения, true (истина, да) и false (ложь, нет).
4. Пустой (Null). Этот тип данных имеет одно значение — null, указывающее на отсутствие какого бы то ни было значения.
5. Неопределенный (Undefined). Этот тип данных имеет одно значение — undefined, указывающее, что переменной не присвоено никакое значение
Из перечисленных типов только String, Number и Boolean могут содержать настоящие данные, a Null и Undefined служат специальным целям. Если вы не хотите присваивать переменной какое-либо конкретное значение, то присвойте ей для определенности значение null. Это действие и будет отвечать вашим чаяниям наилучшим образом. Переменная, имеющая значение null, определена. Она имеет пустое значение. Заметим, что пустая строка (не содержащая ни одного символа, даже пробела), а также число 0 — данные, отличающиеся от null.
Если какая-то переменная встречается в выражении впервые, и ей ранее не присвоено какое бы то ни было значение, то это может вызвать ошибку выполнения. Если переменная объявлена с помощью оператора var, например, var х, то она не имеет пока никакого значения и относится к типу undefined.