Значение в JavaScript всегда имеет определенный тип. Например, строка или число.
В JavaScript существует восемь основных типов данных. Здесь мы рассмотрим их в общих чертах, а в следующих главах поговорим о каждом из них подробно.
Мы можем поместить любой тип в переменную. Например, переменная может в какой-то момент быть строкой, а затем хранить число:
// нет ошибки пусть сообщение = "привет"; сообщение = 123456;
Языки программирования, которые допускают такие вещи, такие как JavaScript, называются «динамически типизированными», что означает, что существуют типы данных, но переменные не привязаны ни к одному из них.
пусть n = 123; п = 12,345;
Тип числа представляет как целые числа, так и числа с плавающей запятой.
Существует множество операций с числами, например умножение *
, деление /
, сложение +
, вычитание -
и так далее.
Помимо обычных чисел, существуют так называемые «специальные числовые значения», которые также относятся к этому типу данных: Infinity
, -Infinity
и NaN
.
Infinity
представляет собой математическую Бесконечность ∞. Это особое значение, большее любого числа.
Его мы можем получить в результате деления на ноль:
предупреждение (1/0); // Бесконечность
Или просто укажите его напрямую:
оповещение(Бесконечность); // Бесконечность
NaN
представляет собой вычислительную ошибку. Это результат неправильной или неопределенной математической операции, например:
alert("не число"/2); // NaN, такое деление ошибочно
NaN
липкий. Любая дальнейшая математическая операция над NaN
возвращает NaN
:
предупреждение( НЭН + 1 ); // НЭН предупреждение(3 * НЭН); // НЭН alert("не число" / 2 - 1); // НЭН
Итак, если где-то в математическом выражении есть NaN
, оно распространяется на весь результат (есть только одно исключение: NaN ** 0
равно 1
).
Математические операции безопасны
Заниматься математикой в JavaScript «безопасно». Мы можем делать что угодно: делить на ноль, рассматривать нечисловые строки как числа и т. д.
Скрипт никогда не остановится из-за фатальной ошибки («умрет»). В худшем случае мы получим в результате NaN
.
Специальные числовые значения формально относятся к типу «число». Конечно, это не числа в обычном смысле этого слова.
Подробнее о работе с числами мы поговорим в главе «Числа».
В JavaScript тип «число» не может безопасно представлять целочисленные значения, превышающие (2 53 -1)
(это 9007199254740991
) или меньше -(2 53 -1)
для отрицательных чисел.
Если быть совсем точным, тип «число» может хранить целые числа большего размера (до 1.7976931348623157 * 10 308
), но за пределами безопасного целочисленного диапазона ±(2 53 -1)
возникнет ошибка точности, поскольку не все цифры подходят. в фиксированное 64-битное хранилище. Таким образом, можно сохранить «приблизительное» значение.
Например, эти два числа (прямо над безопасным диапазоном) одинаковы:
console.log(9007199254740991 + 1); //9007199254740992 console.log(9007199254740991 + 2); //9007199254740992
Так сказать, все нечетные целые числа больше (2 53 -1)
вообще нельзя хранить в типе «число».
Для большинства целей диапазона ±(2 53 -1)
вполне достаточно, но иногда нам нужен весь диапазон действительно больших целых чисел, например, для криптографии или меток времени с точностью до микросекунды.
Недавно в язык был добавлен тип BigInt
для представления целых чисел произвольной длины.
Значение BigInt
создается путем добавления n
в конец целого числа:
// "n" в конце означает, что это BigInt const bigInt = 1234567890123456789012345678901234567890n;
Поскольку числа BigInt
используются редко, мы не рассматриваем их здесь, а посвятили им отдельную главу BigInt. Прочтите ее, когда вам нужны такие большие цифры.
Строка в JavaScript должна быть заключена в кавычки.
let str = "Привет"; let str2 = 'Одинарные кавычки тоже допустимы'; let фраза = `можно встроить еще ${str}`;
В JavaScript существует три типа кавычек.
Двойные кавычки: "Hello"
.
Одинарные кавычки: 'Hello'
.
Обратные кавычки: `Hello`
.
Двойные и одинарные кавычки — это «простые» кавычки. В JavaScript между ними практически нет разницы.
Обратные кавычки — это кавычки с «расширенной функциональностью». Они позволяют нам встраивать переменные и выражения в строку, заключая их в ${…}
, например:
пусть имя = "Джон"; // встраиваем переменную alert(`Привет, ${name}!`); // Привет, Джон! // встраиваем выражение alert(`Результат: ${1 + 2}`); // результат 3
Выражение внутри ${…}
оценивается, и результат становится частью строки. Мы можем поместить туда что угодно: переменную, например name
, или арифметическое выражение, например 1 + 2
, или что-то более сложное.
Обратите внимание, что это можно сделать только в обратных кавычках. Другие цитаты не имеют такой функции встраивания!
alert("Результат: ${1 + 2}"); // результат ${1 + 2} (двойные кавычки ничего не делают)
Мы более подробно рассмотрим строки в главе «Строки».
Типа персонажа нет.
В некоторых языках для одного символа существует специальный тип «символа». Например, в языке C и Java он называется «char».
В JavaScript такого типа нет. Есть только один тип: string
. Строка может состоять из нуля символов (быть пустой), одного символа или многих из них.
Логический тип имеет только два значения: true
и false
.
Этот тип обычно используется для хранения значений да/нет: true
означает «да, правильно», а false
означает «нет, неправильно».
Например:
пусть nameFieldChecked = true; // да, поле имени отмечено пусть ageFieldChecked = false; // нет, поле возраста не отмечено
Логические значения также возникают в результате сравнений:
пусть isGreater = 4 > 1; оповещение (isGreater); // true (результат сравнения «да»)
Мы более подробно рассмотрим логические значения в главе «Логические операторы».
Специальное null
значение не принадлежит ни одному из описанных выше типов.
Он образует отдельный тип, который содержит только null
значение:
пусть возраст = ноль;
В JavaScript null
не является «ссылкой на несуществующий объект» или «нулевым указателем», как в некоторых других языках.
Это просто специальное значение, которое представляет собой «ничего», «пусто» или «значение неизвестно».
В приведенном выше коде указано, что age
неизвестен.
Особняком стоит также специальное значение undefined
. Он создает собственный тип, как и null
.
undefined
значение означает «значение не присвоено».
Если переменная объявлена, но не назначена, то ее значение undefined
:
пусть стареет; оповещение (возраст); // показывает "не определено"
Технически можно явно присвоить undefined
переменной:
пусть возраст = 100; // меняем значение на неопределенное возраст = не определен; оповещение (возраст); // "неопределенный"
…Но мы не рекомендуем этого делать. Обычно null
используется для присвоения переменной «пустого» или «неизвестного» значения, тогда как undefined
зарезервировано как начальное значение по умолчанию для неназначенных объектов.
Тип object
особый.
Все остальные типы называются «примитивными», потому что их значения могут содержать только одну вещь (будь то строка, число или что-то еще). Напротив, объекты используются для хранения коллекций данных и более сложных сущностей.
Будучи настолько важными, объекты заслуживают особого обращения. Мы займемся ими позже в главе «Объекты», после того как узнаем больше о примитивах.
Тип symbol
используется для создания уникальных идентификаторов объектов. Мы должны упомянуть об этом здесь для полноты картины, но отложим детали до тех пор, пока не узнаем объекты.
Оператор typeof
возвращает тип операнда. Это полезно, когда мы хотим по-разному обрабатывать значения разных типов или просто хотим выполнить быструю проверку.
Вызов typeof x
возвращает строку с именем типа:
typeof неопределенный // «неопределенный» тип 0 // «число» тип 10n // "бигинт" typeof true // «логическое значение» typeof "foo" // "строка" typeof Символ("id") // "символ" typeof Math // "объект" (1) typeof null // «объект» (2) typeof alert // "функция" (3)
Последние три строки могут нуждаться в дополнительных пояснениях:
Math
— это встроенный объект, обеспечивающий математические операции. Мы узнаем это в главе Числа. Здесь он служит просто примером объекта.
Результатом typeof null
является "object"
. Это официально признанная ошибка в typeof
, возникшая еще на заре JavaScript и сохраненная для совместимости. Определенно, null
не является объектом. Это особое значение, имеющее отдельный тип. Поведение typeof
здесь неправильное.
Результатом typeof alert
является "function"
, поскольку alert
— это функция. Мы изучим функции в следующих главах, где также увидим, что в JavaScript нет специального типа «функция». Функции относятся к типу объекта. Но typeof
обрабатывает их по-другому, возвращая "function"
. Это также пришло из первых дней существования JavaScript. Технически такое поведение неверно, но на практике может быть удобно.
Синтаксис typeof(x)
Вы также можете встретить другой синтаксис: typeof(x)
. Это то же самое, что и typeof x
.
Проясним: typeof
— это оператор, а не функция. Круглые скобки здесь не являются частью typeof
. Это своего рода круглые скобки, используемые для математической группировки.
Обычно такие скобки содержат математическое выражение, например (2 + 2)
, но здесь они содержат только один аргумент (x)
. Синтаксически они позволяют избежать пробела между оператором typeof
и его аргументом, и некоторым это нравится.
Некоторые люди предпочитают typeof(x)
, хотя синтаксис typeof x
встречается гораздо чаще.
В JavaScript существует 8 основных типов данных.
Семь примитивных типов данных:
number
для чисел любого типа: целых или с плавающей запятой, целые числа ограничены ±(2 53 -1)
.
bigint
для целых чисел произвольной длины.
string
для струн. Строка может содержать ноль или более символов, отдельного односимвольного типа не существует.
boolean
true
/ false
.
null
для неизвестных значений — отдельный тип, имеющий единственное значение null
.
undefined
для неназначенных значений — автономный тип, имеющий единственное значение undefined
.
symbol
уникальных идентификаторов.
И один непримитивный тип данных:
object
для более сложных структур данных.
Оператор typeof
позволяет нам увидеть, какой тип хранится в переменной.
Обычно используется как typeof x
, но также возможен typeof(x)
.
Возвращает строку с именем типа, например "string"
.
Если null
возвращает "object"
— это ошибка языка, на самом деле это не объект.
В следующих главах мы сосредоточимся на примитивных значениях и, как только мы с ними познакомимся, перейдем к объектам.
важность: 5
Каков результат работы скрипта?
let name="Илья"; alert(`привет ${1}`); // ? alert(`привет ${"name"}`); // ? alert(`привет, ${name}`); // ?
Обратные кавычки вставляют выражение внутри ${...}
в строку.
let name="Илья"; // выражение представляет собой число 1 alert(`привет ${1}`); // привет 1 // выражение представляет собой строку «имя» alert(`привет ${"name"}`); // здравствуйте, имя // выражение является переменной, вставьте его alert(`привет, ${name}`); // привет Илья