Типы данных

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

  • Число
  • BigInt
  • Нить
  • логический
  • Нулевой
  • Неопределенный
  • Объект
  • Символ

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

// no error
let message = "hello";
message = 123456;

В языках программирования, в которых переменные могут хранить данные любого типа, таких как JavaScript, говорят, что язык «динамически типизированный». Хотя все еще существуют типы данных, переменные не привязаны к какому-либо конкретному типу. Это означает, что переменная может содержать строковое значение в одной точке и числовое значение в другой точке без каких-либо ошибок.

Число

let n = 123;
n = 12.345;

Числовой тип в JavaScript представляет как целые числа, так и числа с плавающей запятой.

Он поддерживает множество операций, включая умножение , деление /, сложение +, вычитание - и другие. .

Помимо обычных чисел, существуют также «особые числовые значения», принадлежащие этому типу данных: Бесконечность, -Бесконечность и NaN.

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

console.log(1 / 0); // Infinity

NaN (не число) — это специальное числовое значение, указывающее непредставимое значение. Это результат неправильной или неопределенной математической операции.
Например:

console.log("not a number" / 2); // NaN

В JavaScript тип числа является динамическим, что позволяет переменным хранить как целые числа, так и числа с плавающей запятой. Таким образом, переменная может содержать значение 123 в одной точке и 12,345 в другой точке без каких-либо ошибок.

NaN прилипает. Любая дальнейшая математическая операция над NaN возвращает NaN:

alert( NaN + 1 ); // NaN
alert( 3 * NaN ); // NaN
alert( "not a number" / 2 - 1 ); // NaN

• Итак, если где-то в математическом выражении есть NaN, оно распространяется на весь результат (есть только одно исключение: NaN ** 0 равно 1).

Математические операции безопасны.
Выполнение математических операций в JavaScript «безопасно». Мы можем делать что угодно: делить на ноль, рассматривать нечисловые строки как числа и т.д.
Скрипт никогда не остановится с фатальной ошибкой («умирает»). В худшем случае получим NaN в результате.
Специальные числовые значения формально относятся к типу «number». Конечно, это не числа в обычном смысле этого слова. Подробнее о работе с числами мы поговорим в главе «Числа».

БОЛЬШОЙ

В JavaScript тип «число» не может безопасно представлять целочисленные значения больше (2⁵³-1) (это 9007199254740991) или меньше -(2⁵³-1) для отрицательных чисел.

Чтобы быть точным, тип «number» может хранить большие целые числа (до 1,7976931348623157 * 10³⁰⁸), но за пределами безопасного целочисленного диапазона ±(2⁵³-1) будет ошибка точности, потому что не все цифры помещаются в фиксированные 64 -битное хранилище. Таким образом, может быть сохранено «приблизительное» значение.

Например, эти два числа (прямо над безопасным диапазоном) совпадают:

console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992

Таким образом, все нечетные целые числа больше (2⁵³-1) вообще нельзя хранить в типе «число». Для большинства целей диапазона ±(2⁵³-1) достаточно, но иногда требуется весь диапазон действительно больших целых чисел, например, для криптографии или меток времени с микросекундной точностью.

Недавно в язык был добавлен тип BigInt для представления целых чисел произвольной длины.
Значение BigInt создается путем добавления n в конец целого числа:

// the "n" at the end means it's a BigInt
const bigInt = 1234567890123456789012345678901234567890n;

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

Проблемы совместимости.
В настоящее время BigInt поддерживается в Firefox, Chrome, Edge и Safari, но не в Internet Explorer. Чтобы узнать, какие версии браузера поддерживаются, обратитесь к таблице совместимости MDN BigInt.

Нить

string в JavaScript должен быть заключен в кавычки.

let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed another ${str}`;

В JavaScript есть 3 типа кавычек.

  • Двойные кавычки: «Здравствуйте».
  • Одинарные кавычки: «Привет».
  • Обратные кавычки: Hello.

Двойные и одинарные кавычки — это «простые» кавычки. В JavaScript между ними практически нет разницы.

Обратные кавычки — это кавычки «расширенной функциональности». Они позволяют нам встраивать переменные и выражения в строку, заключая их в ${…}, например:

let name = "John";
// embed a variable
alert( `Hello, ${name}!` ); // Hello, John!
// embed an expression
alert( `the result is ${1 + 2}` ); // the result is 3

Выражение внутри ${…} оценивается, и результат становится частью строки. Мы можем поместить туда что угодно: переменную типа имени или арифметическое выражение типа 1 + 2 или что-то более сложное.

Обратите внимание, что это можно сделать только в обратных кавычках. Другие цитаты не имеют этой функции встраивания!

alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} (double quotes do nothing)

Тип символа отсутствует.
В отличие от некоторых языков программирования, таких как C и Java, в JavaScript нет специального "символьного" типа для отдельных символов. Вместо этого в JavaScript есть только один тип, известный как «строка». Строка в JavaScript может быть пустой, содержать один символ или состоять из нескольких символов. Поэтому в JavaScript отдельные символы представлены в виде строк.

Boolean (логический тип)

Логический тип имеет только два значения: true и false. Этот тип обычно используется для хранения значений да/нет: true означает «да, правильно», а false означает «нет, неправильно».

Обычно логические значения используются для представления значений "да/нет" или "истина/ложь".
Например:

let nameFieldChecked = true; // Indicates that the name field is checked (yes).
let ageFieldChecked = false; // Indicates that the age field is not checked (no).

Логические значения также являются результатом операций сравнения, как показано в следующем примере:

let isGreater = 4 > 1;
alert(isGreater); // true (the comparison result is "yes")

«Нулевое» значение

Специальное нулевое значение не принадлежит ни к одному из типов, описанных выше. Он формирует отдельный собственный тип, который содержит только нулевое значение:

let age = null;

В JavaScript null не является «ссылкой на несуществующий объект» или «нулевым указателем», как в некоторых других языках.

Это просто специальное значение, которое представляет «ничего», «пусто» или «значение неизвестно». В приведенном выше коде указано, что возраст неизвестен.

The “undefined” value

Особое значение undefined также стоит особняком. Он создает собственный тип, как и null. Значение undefined — «значение не присвоено». Если переменная объявлена, но не присвоена, то ее значение не определено:

let age;
alert(age); // shows "undefined"

Технически можно явно присвоить значение undefined переменной:

let age = 100;
// change the value to undefined
age = undefined;
alert(age); // "undefined"

…Но мы не рекомендуем этого делать. Обычно null используется для присвоения «пустого» или «неизвестного» значения переменной, в то время как undefined зарезервировано как начальное значение по умолчанию для неназначенных вещей.

Объекты и символы

В JavaScript тип объекта отличается и является особенным по сравнению с другими типами, известными как «примитивы». Примитивы включают в себя такие типы, как строки, числа, логические значения и т. д., и они могут хранить только одно значение за раз.

С другой стороны, объекты используются для хранения коллекций данных и представления более сложных сущностей. Однако для более подробного изучения объектов мы рассмотрим их позже в главе под названием «Объекты», после того как мы получим более глубокое понимание примитивов.

Кроме того, существует еще один тип, называемый «символ», который используется для создания уникальных идентификаторов объектов. Мы упомянули его здесь для полноты картины, но отложим подробности о символах до тех пор, пока не рассмотрим объекты более подробно.

Таким образом, JavaScript обрабатывает объекты иначе, чем примитивные типы, и мы подробно рассмотрим объекты и символы в следующих разделах, чтобы полностью понять их значение и использование.

Оператор typeof

Оператор typeof в JavaScript позволяет нам определить тип операнда, к которому он применяется. Это особенно полезно, когда нам нужно по-разному обрабатывать разные типы значений или когда мы хотим быстро проверить тип значения.

Вот несколько примеров использования оператора typeof и соответствующих результатов:

typeof undefined // "undefined"
typeof 0 // "number"
typeof 10n // "bigint"
typeof true // "boolean"
typeof "foo" // "string"
typeof Symbol("id") // "symbol"
typeof Math // "object" (1)
typeof null // "object" (2)
typeof alert // "function" (3)

Давайте поясним последние три строки:

  1. Результатом typeof Math является «объект». Math — это встроенный в JavaScript объект, обеспечивающий выполнение математических операций. Хотя мы более подробно изучим математику в главе о числах, здесь она служит примером объекта.
  2. Результатом typeof null является «объект». Это хорошо известная ошибка в операторе typeof, которая сохраняется с первых дней существования JavaScript по соображениям совместимости. На самом деле null не является объектом; это специальное значение с собственным отличным типом. Несмотря на эту ошибку, поведение typeof null остается неизменным.
  3. Результатом typeof alert является «функция». В JavaScript функции являются объектами и относятся к объектному типу. Однако typeof по-разному обрабатывает функции и возвращает для них «функцию». Хотя это поведение технически неверно, оно было сохранено для практического удобства, учитывая историческую эволюцию JavaScript.

Таким образом, оператор typeof позволяет нам определить тип значения в JavaScript, но есть некоторые особенности, такие как неправильная классификация null и особая обработка функций как типа «функции».

Синтаксис typeof(x)
Вы также можете встретить другой синтаксис: typeof(x). Это то же самое, что и typeof x.
Чтобы было понятно: typeof — это оператор, а не функция. Скобки здесь не являются частью typeof. Такие скобки используются для математической группировки.
Обычно такие скобки содержат математическое выражение, например
(2 + 2), но здесь они содержат только один аргумент (x). Синтаксически они позволяют избежать пробела между оператором typeof и его аргументом, и некоторым людям это нравится. Некоторые люди предпочитают typeof(x), хотя синтаксис typeof x встречается гораздо чаще.

Краткое содержание

В JavaScript существует 8 основных типов данных, разделенных на две группы:
Семь примитивных типов данных:

  1. number: представляет числа любого типа, включая целые числа и числа с плавающей запятой. Целые числа ограничены ±(2^53-1).
  2. bigint: используется для представления целых чисел произвольной длины.
  3. string: Представляет последовательности символов. Строка может быть пустой или содержать один или несколько символов. Для отдельных символов нет отдельного типа.
  4. boolean: представляет истинные или ложные значения.
  5. null: представляет неизвестные значения и является автономным типом только с одним возможным значением: null.
  6. undefined: представляет неназначенные значения и является автономным типом только с одним возможным значением: undefined.
  7. symbol: Используется для создания уникальных идентификаторов.

Один непримитивный тип данных:
8. object: представляет более сложные структуры данных, такие как наборы данных и сущностей.
Оператор typeof используется для определения типа значение переменной. Обычно записывается как typeof x, но допустимо и typeof(x). Он возвращает строку, указывающую имя типа, например, «строка», «число», «логическое значение» и т. д.
Однако в поведении typeof null есть странность. , где он неправильно возвращает «объект» вместо «нуль». Такое поведение является давней ошибкой языка, которая была сохранена из соображений совместимости.
Итак, в JavaScript есть 8 типов данных: 7 примитивных (число, bigint, строка, логическое значение, нуль, неопределенный, символ) и 1 не примитивный (объект), а оператор typeof используется для определения типа значения переменной.