В этом уроке мы познакомимся с очень важным понятием – типы данных JavaScript. Мы рекомендуем внимательно отнестись к данному понятию – если не осознать его с самого начала, то потом придется часто сталкиваться со странным поведением созданной вами программы.
Динамическая типизация
В процессе работы компьютерные программы манипулируют различными значениями, каждое из которых может быть обработано в языке программирования и относится к определённому типу данных.
В JavaScript типы данных можно разделить на две категории: простые (их также называют примитивными) типы и составные (их также называют ссылочными или объекты).
JavaScript – это слабо типизированный или динамический язык программирования, который позволяет определять типы данных, осуществлять синтаксический анализ и компиляцию как говорится «на лету», на этапе выполнения программы. Это значит, что вам не нужно определять тип переменной заранее. Тип определится автоматически во время выполнения программы.Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов:
Типы данных
Стандарт ECMAScript® определяет следующие типы данных:
- Простые (их также называют примитивными) типы:
- логический (англ. Boolean) — может принимать два возможных значения, иногда называемых истиной (true) и ложью (false);
- нулевой (англ. Null) – значение null представляет ссылку, которая указывает, обычно намеренно, на несуществующий или некорректный объект или адрес;
- неопределённый (англ. Undefined) – обозначает предопределенную глобальную переменную, инициализированную неопределенным значением;
- числовой (англ. Number) – числовой тип данных в формате 64-битного числа двойной точности с плавающей запятой;
- строковый (англ. String) – представляет собой последовательность символов, используемых для представления текста;
- символ (англ. Symbol) — тип данных, экземпляры которого уникальны и неизменяемы. (новый в ECMAScript 6).
- Объектный (англ. Object) – это коллекция именованных значений, которые обычно называют свойствами (properties) объекта.

Разница между примитивными и составными типами
Прежде чем рассмотреть каждый тип данных, познакомимся сначала с оператором typeof. Оператор typeof возвращает строку, описывающую тип данных переменной.
Продемонстрируем его работу на следующем примере:
Сценарий в приведенном примере объявляет переменные, выполняет их инициализацию (присваивает значения), а затем выводит тип каждой переменной.
Разница между примитивными и составными типами данных проявляется при копировании их значений.
Когда переменной присваивается значение простого типа, то в переменную записывается само значение (например число). Когда мы присваиваем переменную простого типа в другую, она копирует значение. В результате каждая переменная будет иметь своё значение и изменения в одной из переменных никак не сказывается на значении другой переменной:
Когда переменной присваиваем значение составного (ссылочного) типа, то в переменную записывается ссылка на значение (ссылка на объект). Когда мы присваиваем одну переменную (в значении которой ссылка на составное значение) другой переменной, то происходит копирование ссылки на составное значение. В результате обе переменные ссылаются на одно и то же составное значение и изменения в значении одной из переменных будут сказываться на другой переменной:
Примитивные типы
Все типы данных в JavaScript, кроме объектов, являются неизменяемыми или иммутабельными (англ. immutable). Это значит, что их значения не могут быть модифицированы, а только перезаписаны новым другим значением. Например, строки нельзя корректировать посимвольно – их можно переписать только полностью. Значения таких типов называются "примитивными".
Простейшие данные, с которыми может оперировать программа, называются литералами. Литералы — это числа или строки, которые используются для представления значений в JavaScript. Предоставляемая информация может быть самой разнообразной, а поэтому значения бывают различных типов. Простейшие типы данных в JavaScript называются основными типами данных: числа, строки и логические значения. Все они относятся к "примитивным".
Булевый (логический) тип «boolean»
Логические, или булевы значения (по фамилии их изобретателя — Буля), могут иметь лишь одно из двух значений: true (истина) или false (ложь). Значения true или false обычно появляются в операциях сравнения или логических операциях.
Приведенная ниже программа создает булеву переменную, а затем тестирует ее значение с использованием инструкции if/else:
В качестве сравнительного выражения можно использовать любое выражение. Любое выражение, которое возвращает значение 0, null, undefined или пустую строку, интерпретируется как false. Выражение, определяющее какое-либо другое значение, интерпретируется как true.
Примечание: При записи булевых значений их не заключают в кавычки: var myVar = true;
В то же время объявление var myVar = "true" создает строковую переменную.
Тип данных Number
В JavaScript, нет различия между целым числом и числом с плавающей точкой – по сути, JavaScript представляет все числа в качестве значения с плавающей точкой.
Для представления чисел в JavaScript используется 64-битный формат, определяемый стандартом IEEE-754. Этот формат способен представлять числа в диапазоне от ±1,7976931348623157 × 10308 до ±5 × 10-324.
Число, находящееся непосредственно в коде программы, называется числовым литералом. Помимо десятичных целых литералов JavaScript распознает шестнадцатеричные значения.
Числа в шестнадцатиричном формате могут включать любую последовательность цифр от 0 до 9 и буквы от a до f, которая обязательно начинается с последовательности символов «0x».
var a = 255;
var b = 0xFF; // Число 255 в шестнадцатеричной системе исчисления
Кроме того, JavaScript содержит специальные числовые значения:
NaN(не число или ошибка вычислений). Является результатом некорректной математической операции над недопустимыми данными, такими как строки или неопределенное значение.Infinity(положительная бесконечность). Используется, если положительное число слишком велико и не может быть представлено в JavaScript.-Infinity(отрицательная бесконечность). Используется, если отрицательное число слишком велико и не может быть представлено в JavaScript.±0(положительный и отрицательный 0). JavaScript различает положительный и отрицательный ноль.
Тип данных String
Строковый тип (string) - это неизменяемая, упорядоченная последовательность 16-битных значений, каждое из которых представляет символ Unicode (буквы, цифры, знаки пунктуации, специальные символы и пробелы). Строки могут быть пустыми либо состоять из одного и более символов. Строки создаются при помощи двойных (") или одинарных (') кавычек. В строке, ограниченной парой одинарных кавычек, можно использовать двойные кавычки, и наоборот – одинарные кавычки можно использовать в строке, заключенной в пару двойных кавычек:
В JavaScript нет разницы между двойными и одинарными кавычками, но кавычки в начале и конце строки не должны различаться. Например, такое выражение вызовет синтаксическую ошибку:
var firstName = "Max'; //синтаксическая ошибка - разные кавычкиПримечание: В JavaScript нет специального типа данных для одного символа, такого как char в C, C++ и Java. Одиночный символ представлен строкой единичной длины.
Тип данных Null
Нулевой тип(null) содержит единственное специальное значение – null.
Ключевое слово null невозможно использовать в качестве имени функции или переменной. Значение null является ссылкой на «пустой» объект и имеет специальное назначение – обычно оно используется для инициализации переменной, которой впоследствии будет присвоено значение.
Оператор typeof для значения null возвращает строку «object», что свидетельствует о том, что значение null является специальным «пустым» объектом.
Тип данных Undefined
Неопределенный тип (undefined) образует свой собственный тип, который содержит единственное специальное значение – undefined. Такое значение имеет переменная, объявленная с помощью оператора var, но не инициализированная:
Значение undefined возвращается при обращении к переменной, которой никогда не присваивалось значение, а также к несуществующему свойству объекта или элементу массива.
Следует отметить, что переменная со значением undefined отличается от переменной, которая вообще не определена:
В этом примере метод alert() выводит значение переменной age, то есть undefined. Во втором случае в метод alert() передается необъявленная переменная car, что приводит к ошибке.
Следующй пример может несколько запутать начинающих программистов, т.к. оператор typeof и для неинициализированной, и для необъявленной переменной возвращает значение undefined:
В приведенном примере переменная age объявлена, но в неё ничего не записано, поэтому её значение как раз и есть undefined. Переменная car не объявлена – её, по сути, нет. Тем не менее, typeof возвращает строку undefined в обоих случаях. Некоторый смысл в этом, конечно, есть, потому что с любой из этих переменных невозможно выполнить никаких операций, хотя технически они совершенно разные.
Примечание: Рекомендуется всегда выполнять инициализацию объявленной пременной. В таком случае вы будете знать, что оператор typeof возвращает undefined из-за того, что переменная не была объявлена, а не потому, что она не инициализирована.
Значение undefined является производным от null, так что в ЕСМА-262 оператор эквивалентности == считает их равными:
Несмотря на то, что значения null и undefined связаны, используются они по-разному. Не следует явно присваивать переменной значение undefined, однако к null это требование не относится. В случае, когда необходимый объект недоступен, вместо него следует использовать null. Это указывает на то, что значение null было введено как указатель на пустой объект, и подчеркивает его отличие от undefined.
Чтобы отличать null и undefined в программе можно использовать оператор идентичности ===:
Тип данных Символ (Symbol)
Символ (symbol) является нововведением JavaScript начиная с ECMAScript версии 6. Символ – это уникальное, неизменяемое, примитивное значение, которое служит для создания уникальных идентификаторов.
Чтобы создать символ нужно вызвать функцию Symbol:
var mySymbol = Symbol();Для определения символа можно использовать оператор typeof, в случае если значения является символом будет возвращена строка symbol:
У функции Symbol есть необязательный параметр — строка, которая служит для описания символа:
Важной особенностью символа также является то, что его значение уникально. Вы можете использовать символ как имя свойства, которое гарантированно не будет повторяться с любым другим свойством. Даже, если у двух символов одинаковое имя, то это не значит, что они равны:
Тип данных Object
В дополнение к рассмотренным выше примитивным типам данных JavaScript поддерживает составной тип данных – объект (object). Объект состоит из многих значений (либо элементарных, таких как числа и строки, либо сложных, например других объектов), которые называются свойствами объекта. Доступ к свойствам осуществляется по имени свойства (иногда говорят «по ключу»).
Имя свойства является строкой, поэтому можно считать, что объекты связывают строки со значениями. Вместе эти фрагменты информации образуют пары «ключ-значение».
В JavaScript объекты можно создавать одним из двух синтаксисов:
1. var obj = {}; // с помощью объектного литерала
2. var obj = new Object(); // с помощью метода, называемого конструкторомСоздание объекта с помощью объектного литерала начинается с определения обычной переменной. В правой части этой инструкции записывается литерал объекта – это заключенный в фигурные скобки {} список разделенных запятой пар "имя-значение", заключенный в фигурные скобки. Имя свойства и значение отделены друг от друга двоеточием:
var cat = {
"legs": 4,
"name": "Мурзик",
"color": "Рыжий"
}Второй способ создания объектов связан с использованием конструктора Object(). При этом сначала используется выражение new Object(), а затем определяются и инициализируются свойства полученного объекта:
var cat = new Object();
cat.legs = 4;
cat.name = "Мурзик";
cat.color = "Рыжий";Обратиться к свойству legs объекта cat можно посредством выражения cat.legs. Такую запись называют точечной нотацией. Точка между именем объекта и свойством указывает на принадлежность свойства данному объекту. Свойства объекта работают как переменные – в них можно сохранять значения и считывать их:
Итоги
- Оператор typeof x позволяет выяснить, какой тип находится в x, возвращая его в виде строки.
- Когда мы присваиваем переменную простого типа в другую, она копирует значение. В результате каждая переменная будет иметь своё значение и изменения в одной из переменных никак не сказывается на значении другой переменной.
- Когда мы присваиваем одну переменную (в значении которой ссылка на составное значение) другой переменной, то происходит копирование ссылки на составное значение. В результате обе переменные ссылаются на одно и то же составное значение и изменения в значении одной из переменных будут сказываться на другой переменной.
- Любое выражение, которое возвращает значение 0, null, undefined или пустую строку, интерпретируется как
false. -
Строки создаются при помощи двойных
(")или одинарных(')кавычек. В строке, ограниченной парой одинарных кавычек, можно использовать двойные кавычки, и наоборот – одинарные кавычки можно использовать в строке, заключенной в пару двойных кавычек. - Значение
nullявляется ссылкой на «пустой» объект и имеет специальное назначение – обычно оно используется для инициализации переменной, которой впоследствии будет присвоено значение. - Значение
(undefined)имеет переменная, объявленная с помощью оператораvar, но не инициализированная. - В JavaScript объекты можно создавать одним из двух способов:
- с помощью объектного литерала
- с помощью метода, называемого конструктором
- Объект содержит неупорядоченную коллекцию свойств, каждое из которых содержит имя и значение. В объект можно в любой момент добавить новые именованные значения или удалить существующие.
Задачи
-
Тип данных Null
Что выведет alert(typeof null); ?
Показать решениеalert(typeof null);Решение:
Оператор
typeofдля значенияnullвозвращает строку «object», что свидетельствует о том, что значениеnullявляется специальным «пустым» объектом. Выведет сообщение "object".-
Тип данных Number
Что выведет alert(typeof NaN); ?
-


Комментарии
<code>, несколько строчек кода — в теги<pre><code>...ваш код...</code></pre>.