В этом уроке мы познакомимся с очень важным понятием – типы данных 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>
.