Величины
Представьте океан бит. Типичный современный компьютер хранит более 30 миллиардов бит в оперативной памяти. Постоянная память (жёсткий диск) обычно ещё на пару порядков объёмнее.
Чтобы работать с ними и не заблудиться, вы можете делить их на куски, представляющие единицы информации. В JavaScript эти куски называются величинами. Все они состоят из бит, но играют разные роли. У каждой величины есть тип, определяющий её роль. Всего есть шесть основных типов: числа, строки, булевы величины, объекты, функции и неопределённые величины.
Для создания величины вам нужно указать её имя. Это удобно. Вам не надо собирать стройматериалы или платить за них. Нужно просто позвать – и оп-па, готово. Они не создаются из воздуха – каждая величина где-то хранится, и если вы хотите использовать огромное их количество, у вас могут закончиться биты. К счастью, это только если они все нужны вам одновременно. Когда величина вам станет не нужна, она растворяется, и использованные ею биты поступают в переработку как стройматериал для новых величин.
В этой главе мы знакомимся с атомами программ JavaScript – простые типы величин и операторы, которые к ним применимы.
Числа
Величины числовых типов, это – сюрприз – числа. В программе JavaScript они записываются как
13
Используйте эту запись в программе, и она вызовет к жизни в компьютерной памяти цепочку бит, представляющую число 13.
JavaScript использует фиксированное число бит (64) для хранения численных величин. Число величин, которые можно выразить при помощи 64 бит, ограниченно – то есть и сами числа тоже ограниченны. Для N десятичных цифр количество чисел, которые ими можно записать, равно 10 в степени N. Аналогично, 64 битами можно выразить 2 в 64 степени чисел. Это довольно много.
Раньше у компьютеров памяти было меньше, и тогда для хранения чисел использовали группы из 8 или 16 бит. Было легко случайно превысить максимальное число для таких небольших чисел – то есть, использовать число, которое не помещалось в этот набор бит. Сегодня у компьютеров памяти много, можно использовать куски по 64 бит, и значит, вам надо беспокоиться об этом только, если вы работаете с астрономическими числами.
Правда, не все числа меньше 2 помещаются в число JavaScript. В этих битах также хранятся отрицательные числа – поэтому, один бит хранит знак числа. Кроме того, нам нужно иметь возможность хранить дроби. Для этого часть бит используется для хранения позиции десятичной точки. Реальный максимум для чисел – примерно 10, что в общем всё равно довольно много.
Дроби записываются с помощью точки.
9.81
Очень большие или маленькие числа записываются научной записью с буквой "e" (exponent), за которой следует степень:
2.998e8
Это 2,998 × 10 = 299800000.
Вычисления с целыми числами (которые также называются integer), меньшими, чем 10, гарантированно будут точными. Вычисления с дробями обычно нет. Так же, как число π (пи) нельзя представить точно при помощи конечного числа цифр, так и многие дроби нельзя представить в случае, когда у нас есть только 64 бита. Плохо, но это мешает в очень специфических случаях. Важно помнить об этом и относиться к дробям как к приближённым значениям.
Арифметика
Главное, что можно делать с числами – это арифметические вычисления. Сложения и умножения используют два числа и выдают третье. Как это записывается в JavaScript:
100 + 4 * 11
Символы + и * называются операторами. Первый – сложение, второй – умножение. Помещаем оператор между двумя величинами и получаем значение выражения.
А в примере получается "сложить 4 и 100 и затем умножить результат на 11", или умножение выполняется сначала? Как вы могли догадаться, умножение выполняется первым. Но как и в математике, это можно изменить при помощи скобок:
(100 + 4) * 11
Для вычитания используется оператор -, а для деления - /.
Когда операторы используются без скобок, порядок их выполнения определяется их приоритетом. У операторов * и / приоритет одинаковый, выше, чем у + и -, которые между собой равны по приоритету. При вычислении операторов с равным приоритетом они вычисляются слева направо:
1 - 2 + 1
вычисляется как (1 - 2) + 1.
Пока беспокоиться о приоритетах не надо. Если сомневаетесь, используйте скобки.
Есть ещё один оператор, который вы не сразу узнаете. Символ % используется для получения остатка. X % Y – остаток от деления X на Y. 314 % 100 даёт 14, и 144 % 12 даёт 0. Приоритет у оператора такой же, как у умножения и деления. Математики для операции нахождения остатка от деления% могут использовать термин сравнение по модулю.
Специальные числа
В JavaScript есть три специальных значения, которые считаются числами, но ведут себя не как обычные числа.
Это Infinity и -Infinity, которые представляют положительную и отрицательную бесконечности. Infinity - 1 = Infinity, и так далее. Не надейтесь сильно на вычисления с бесконечностями, они не слишком строгие.
Третье число: NaN. Обозначает "not a number" (не число), хотя это величина числового типа. Вы можете получить её после вычислений типа 0 / 0, Infinity – Infinity, или других операций, которые не ведут к точным осмысленным результатам.
Строки
Следующий базовый тип данных – строки. Они используются для хранения текста. Записываются они в кавычках:
"Что посеешь, то из пруда"
'Баба с возу, потехе час'
Можно использовать как двойные, так и одинарные кавычки – главное использовать их вместе. Почти всё можно заключить в кавычки и сделать из этого строку. Но некоторые символы вызывают проблемы. Например, сложно заключить кавычки в кавычки. Перевод строки тоже нельзя просто так заключить в них – строка должна идти одной строкой.
Для заключения специальных символов используется обратный слэш (\). Он обозначает, что символ, идущий за ним, имеет специальное значение – это называется "экранирование символов" (escape character). \" можно заключать в двойные кавычки. \n обозначает перевод строки, \t – табуляцию.
Строка "Между первой и второй\nсимвол будет небольшой" на самом деле будет выглядеть так:
Между первой и второй
символ будет небольшой
Если вам нужно включить в строку обратный слэш, его тоже нужно экранировать: \\. Инструкцию "Символ новой строки - это "\n"" нужно будет написать так:
"Символ новой строки – это \"\\n\""
Строки нельзя делить, умножать и складывать. Однако с ними можно использовать оператор +, который будет соединять их друг с другом. Следующее выражение выдаст слово "соединение":
"сое" + "ди" + "н" + "ение"
Есть много способов манипуляций со строками, которые мы обсудим в главе 4.
Унарные операторы
Не все операторы записываются символами – некоторые словами. Один из таких операторов – typeof, который выдаёт название типа величины, к которой он применяется.
console.log(typeof 4.5)
// → number
console.log(typeof "x")
// → string
Будем использовать вызов console.log в примерах, когда захотим увидеть результат на экране. Как именно будет выдан результат – зависит от окружения, в котором вы запускаете скрипт.
Предыдущие операторы работали с двумя величинами, однако typeof использует только одну. Операторы, работающие с двумя величинами, называются бинарными, а с одной – унарными. Минус (вычитание) можно использовать и как унарный, и как бинарный.
console.log(- (10 - 2))
// → -8
Булевские величины
Часто вам нужна величина, которая просто показывает одну из двух возможностей – типа "да" и "нет", или "вкл" и "выкл". Для этого в JavaScript есть тип Boolean, у которого есть всего два значения – true и false (правда и ложь).