Глаза страшат, а руки делают

ЧАСТЬ ПЕРВАЯ


4. Наводим в мозгах порядок
(переменные, типы данных, простые операторы)

  • и снова переменные;
  • ещё раз о типах данных;
  • простые операторы (арифметические и логические операторы)

Из разбора функции предыдущего урока можно было сделать вывод, что JavaScript не такой уж сложный язык в смысле грамматики, но в нём много всяких слов и выражений, которые нужно запоминать. В общем, где-то так. Правда, я должен предупредить, что мы познакомились далеко не со всей грамматикой, но она действительно не слишком сложна. А вот всевозможные объекты, свойства, методы...

Конечно, в идеале всё это желательно запомнить (чтобы писать коды любой сложности «на коленке»), но вполне можно работать и со шпаргалкой, со словарём. Такую шпаргалку-словарь я планирую составить. А пока немного наведём порядок и разложим кое-что по полочкам. Впереди у нас такая пока не затронутая вещь, как массивы. А это штука довольно сложная, особенно какие-нибудь двумерные массивы для человека с сугубо гуманитарным опытом, и поэтому лучше приступать к ним в чистой и проветренной комнате.

Хотя этот урок — ещё не обещанная шпаргалка, думаю, Вы будете не раз заглядывать в него для прочистки мозгов.

Итак, мы коснулись следующих понятий:

  • Переменные
  • Типы данных
  • Операторы
  • Функции
  • Объекты

Переменные

Мы уже умеем их называть. Объявляли мы их только одним способом, а способов этих несколько.

  1. Непосредственным назначением:
myName = "Андрей";
  1. Без назначения, с помощью ключевого слова:
var myHome;
  1. С помощью ключевого слова и с непосредственным назначением:
var myAge = 47;

То есть если мы сразу задаём переменной конкретное значение, то ключевое слово var не обязательно.

Если мы объявляем переменную «про запас», ничего пока на неё не назначая, то ключевое слово var обязательно.

С помощью одного ключевого слова можно назначить несколько переменных, как с непосредственным назначением, так и без него, переменные разделяются запятыми:

var myName = "Андрей", myHome, myAge = 47;

Переменные имеют область действия, они делятся на глобальные и локальные. Переменные, объявленные в теле функции, действуют только внутри функции. Они локальны. Остальные — глобальны и действуют с момента объявления до конца программы. Поэтому глобальные переменные «про запас» часто объявляют в самом начале скрипта.

И ещё одно «правило для дураков»: нельзя давать переменным имена, которые соответствуют ключевым словам. Но поскольку «в дураках» может оказаться любой недостаточно сведущий человек, я об этом упоминаю. И даже приведу небольшой список наиболее употребительных ключевых слов:

var, if, else, const, true, false, function, super, switch, for, while

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

Примечание

Я тут недавно употребил слово var для имени (id) элемента (см. Урок 3). Возможно, это не слишком удачно с педагогической точки зрения. Но вполне безопасно, так как это не переменная, а строка, заключённая в кавычки.

Типы данных

Вот полная таблица всех типов данных из учебника В. Дунаева:

Тип данных

Примеры

Описание значений

Строковый (string)

"Привет"
"д.т. 123-4567"

Последовательность символов, заключенная в кавычки, двойные или одиночные

Числовой (number)

3.14
-567
+2.5

Число, последовательность цифр, перед которой может быть указан знак числа (+ или -); перед положительными числами не обязательно ставить знак «+»; целая и дробная части чисел разделяются точкой. Число записывается без кавычек

Логический (булев, boolean)

true
false

true (истина, да) или false (ложь, нет); возможны только два значения

Null

 

Отсутствие какого бы то ни было значения

Объект (object)

 

Программный объект, определяемый своими свойствами. В частности, массив также является объектом

Функция (function)

 

Определение функции — программного кода, выполнение которого может возвращать некоторое значение

Что такое логический (булев) тип данных?

Предположим, нам нужно из сотни вариантов выбрать только те, которые соответствуют определённому условию. Сколько их и есть ли они вообще, мы не знаем, так как проверяем базу данных, которая всё время обновляется. Мы зададим нужное условие и назначим на него булеву переменную со значением true. И зададим ещё одно условие: девочки (true) налево, мальчики (false) направо. Вот примерно так это выглядит «на пальцах». А когда доберёмся до конкретных примеров, поговорим серьёзнее.

Всё-таки удивительный человек был этот Джордж Буль (между прочим, отец писательницы Войнич, которая «Овода» написала). При жизни его считали хоть и гением, но большим чудаком, носившимся с какой-то никому не нужной логической алгеброй. А вот потом выяснилось, что программистам без неё, ну, никак.

Null следует отличать от нулевого значения. Нулевое значение — это, всё-таки, значение. А вот Null — это отсутствие какого-либо значения, даже нулевого.

Об объектах и функциях как типах данных будем говорить, когда рассмотрим их поближе.

Скажу только, что в других языках протраммирования типы данных понимаются несколько по-другому. Там бывает несколько числовых типов (короткое целое число, длинное целое число, число с плавающей запятой и т.д.), а функции — это функции, и никакого отношения к типам данных не имеют. Но это так, к слову. Вдруг Вы уже изучали какой-нибудь другой язык и теперь сильно удивились.

Операторы

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

Пробежимся по их классификации.

Я предлагаю разделить все операторы на две группы: простые и сложные. Под простыми будем понимать те, которые выполняют какое-то одно конкретное действие и записываются неким условным обозначением. Сложные выполняют целый алгоритм и включают в свою запись фрагменты кода этого алгоритма.

Из простых нам уже встречались комментарии, которые просто отсекают фрагмент текста от общего кода, и один из операторов присвоения в виде простого знака равенства, с помощью которого мы присваивали значения переменным. Встречался нам и оператор равенства (из группы операторов сравнения) в виде сдвоенного знака равенства.

Из сложных — мы познакомились с одним из операторов условного перехода: if...else.

Термины «простые» и «сложные» — моё «изобретение». Внутри этих групп я придерживаюсь традиционной классификации.

Вот самая общая сводная таблица групп операторов:

Простые

Сложные

Комментарии

Условного перехода 

if...else

Арифметические

switch

Сравнения

Цикла 

for

Присвоения

while

Логические

do...while

Простые операторы

Ещё раз о комментариях

О комментариях уже было сказано всё, что о них можно сказать. Лишний раз призываю: не путайте комментарии HTML и комментарии JavaScript.

И маленький совет: если Вы хотите удалить кусок кода, но предполагаете, что он Вам ещё может пригодиться, не стирайте его, а просто закомментируйте. Это бывает полезно при отладке скрипта, когда, перепробовав массу вариантов, мы всё же возвращаемся ближе к исходному.

Арифметические операторы

Вот их полный список:

Оператор

Название

Пример

+

Сложение

X+Y

-

Вычитание

X-Y

*

Умножение

X*Y

/

Деление

X/Y

%

Деление по модулю

X%Y

++

Увеличение на 1

X++

--

Уменьшение на 1

Y--

Для «школьных» операторов, думаю, комментарии излишни. Кроме одного: так же, как и в школе, минус употребляется не только для вычитания, но и для обозначения отрицательного числа.

Что такое «деление по модулю»? Этот оператор возвращает не частное, а остаток от деления. Например, 12%3 возвратит 0, а 14%3 возвратит 2. Понятно?

Операторы увеличения и уменьшения действуют так:

x++ то же, что x+1

y-- то же, что y-1

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

Операторы сравнения

Оператор

Название

Пример

==

Равно

X == Y

!=

Не равно

X != Y

>

Больше, чем

X > Y

>=

Больше или равно

X >= Y

<

Меньше, чем

X < Y

<=

Меньше или равно

X <= Y

Эти операторы сравнивают не только числа, но и строки, и булевы значения.

Каким образом?

Ну, с булевыми значениями просто. Значение true всегда равно единице, а false — нулю.

А строки...

У каждой буквы и любой закорючки из шрифта есть числовые значения ANSII, Unicode и т.д. Вот эти значения и сравнивают операторы. Числовое значение строки равно сумме значений всех её символов. В какой кодировке? Это может зависеть от типа и версии браузера, от местных национальных настроек. Во всяком случае, у цифр, латинских букв и «препинаков» коды единообразные. В числовых значениях кириллицы и «санскритицы» (деванагари) у меня всегда проходил Unicode. Хотя и не уверен, что это «истина для всех». Вообще проблеме кодировок можно посвятить целую диссертацию...

Но если не вдаваться в тонкости, то, например, латинское маленькое «a» во всех популярных кодировках равно 97, «b» — 98, и т.д. То есть ab == 195, ac == 196, значит, ab < ac (или ac > ab).

Вы можете спросить, кому это всё нужно. Может быть, лично Вам это никогда и не понадобится. А вдруг да и понадобится — всякое бывает... Вот тогда-то Вы и вспомните... что есть страничка, на которой это можно подглядеть.

Операторы присвоения

Кроме основного оператора присвоения, обозначающегося знаком равенства, существует несколько дополнительных, в которых присвоение комбинируется с арифметическими действиями. В следующей таблице показаны примеры этих операторов и более привычные выражения, которые они заменяют. Эти операторы, как и два последних арифметических, пришли сюда из языка C (си).

ОСНОВНОЙ

Оператор

Пример

=

var x = "моя строка"

ДОПОЛНИТЕЛЬНЫЕ

Оператор

Пример

Эквивалентное выражение

+=

X+=Y

X = X + Y

-=

X-=Y

X = X - Y

*=

X*=Y

X = X * Y

/=

X/=Y

X = X / Y

%=

X%=Y

X = X % Y

Вообще JavaScript по своему синтаксису относится к языкам семейства C и похож он на C и C++ примерно так же, как какой-нибудь креольский на классический французский.

Логические операторы

Оператор

Название

Пример

!

Отрицание (НЕ)

!X

&&

И

X && Y

||

ИЛИ

X || Y

Предположим, есть две фирмы. Одной руководит Иванов, другой — Петров. И у каждого есть вакансии. Но Иванову нужен человек не старше 35 лет и со стажем не менее 10 лет, а у Петрова условия чуть помягче: либо не старше 35, либо со стажем не менее 10. И пришли к одному и другому 4 человека. Запустили Иванов с Петровым свои компьютеры, и вот что эти компьютеры выдали:

X (возраст)

Y (стаж)

X && Y (Иванов)

X || Y (Петров)

35 лет

10 лет

true (да)

true (да)

28 лет

8 лет

false (нет)

true (да)

48 лет

15 лет

false (нет)

true (да)

36 лет

9 лет

false (нет)

false (нет)

C'est la vie...

А между тем мы покончили с простыми операторами, займёмся сложными.

НО ТОЛЬКО УЖЕ ЗАВТРА!!!


Итак, мы узнали:

почти всё о переменных, немного нового о типах данных, а также множество простых операторов, как нужных, так и не очень.


К следующему уроку >>


 008797