Урок 4 - Наводим в мозгах порядок



  • и снова переменные;
  • ещё о типах данных;
  • простые операторы

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

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

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

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

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

Переменные

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

  1. Непосредственным назначением:

    myName = "Андрей";

  2. Без назначения, с помощью ключевого слова:

    var myHome;

  3. С помощью ключевого слова и с непосредственным назначением:

    var myAge = 47;

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

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

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

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

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

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

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

Примечание: Я тут недавно употребил слово var для имени элемента. Возможно, это не слишком удачно с педагогической точки зрения. Но вполне безопасно, так как это не переменная, а строка, которая в кавычках.

Типы данных

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

Тип данныхПримерыОписание значений
Строковый (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
++Увеличение на 1X++
--Уменьшение на 1Y--

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

Что такое «деление по модулю»? Этот оператор возвращает не частное, а остаток от деления. Например, 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+=YX = X + Y
-=X-=YX = X - Y
*=X*=YX = X * Y
/=X/=YX = X / Y
%=X%=YX = 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...

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

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

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

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

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

К списку уроков JavaScript

(© А. Фролов)