§12. Идентификаторы. Инструкции break, continue. Операторы и операнды.

Учимся программировать вместе с JavaScript
Глава II. Дополнительные сведения по базовому JavaScript.

§12. Идентификаторы. Инструкции break, continue. Операторы и операнды.

Идентификаторы. Негласные правила формирования идентификаторов. Использование транслитерации при формировании идентификаторов. Венгерская нотация. Идентификаторы переменных счётчиков в циклах счётчиках. Досрочный выход из цикла. Инструкция break. Пропуск прохода цикла. Инструкция continue. Оператор, операнд. Унарный, бинарный и тернарный операторы. Оператор присваивания (=). Арифметические операторы. Операторы присваивания с операцией.

Идентификаторы. 

До сих пор мы использовали следующие словосочетания: «имя переменной», «имя функции» или «имя объекта». В любой программистской литературе вместо слова имя вы встретите слово идентификатор. На практике идентификатор – это любое имя, которое дано чему-либо вами или каким-либо другим программистом. 

Для формирования идентификаторов в JavaScript существуют следующие правила: первым символом должна быть буква, символ подчеркивания «_» или знак доллара «$»; последующие символы могут быть любой буквой, цифрой, символом подчеркивания или знаком доллара. Так же идентификатор не может совпадать ни с одним из зарезервированных слов, список которых был приведён во втором параграфе. 

 

Негласные правила формирования идентификаторов. 

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

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

  • вместо пробела можно использовать символ подчёркивания, например: name_of_man (имя человека); 

  • сам идентификатор пишется маленькими буквами, но каждое новое слово начинается – с большой, например: nameOfMan. 

 

Использование транслитерации при формировании идентификаторов. 

Если вы не знаете английский язык, то можете составлять идентификаторы из русских слов латинскими буквами. 

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

Такой способ формирования идентификаторов не приветствуется среди программистов. 

 

Венгерская нотация. 

Венгерская нотация – соглашение, принятое среди программистов, о правилах именования идентификаторов в коде программ в зависимости от типа переменной. Эти правила предложил сотрудник компании Microsoft Чарльз Симони, в те далёкие времена, когда писались первые версии MS-DOS. В дальнейшем эти правила стали внутренним стандартом Microsoft. Родом Чарльз Симони был из Венгрии, отсюда и название нотации. 

Суть нотации заключается в том, что при формировании идентификатора перед именем переменной ставится префикс. Префикс – один или несколько символов, указывающие на тип переменной, или несущие определённый смысл. Далее в таблице приведены самые распространённые префиксы, которыми вы можете пользоваться. Более полный список вы можете найти в Интернете. 

 

Префиксы, обозначающие тип переменной: 

Префикс 

Сокращение от 

Смысл 

Пример 

s, str 

string 

строка 

sName 

i 

int 

целочисленная переменная 

iLeftSide 

r 

real 

переменная вещественного типа 

rDistance 

b 

boolean 

булева переменная 

bSort 

a 

array 

массив 

aPupils 

g_ 

global 

глобальная переменная 

g_aPupils 

 

Префиксы, обозначающие назначение переменных. 

Префикс 

Сокращение от 

Смысл 

Пример 

i 

index 

Индекс 

iIndex 

d 

delta 

Разница между значениями 

dAB 

n 

number 

Число, количество чего либо 

nApples 

c 

counter 

Счётчик 

сPrss 

cur 

current 

Текущее значение 

curNumber 

 

Идентификаторы переменных счётчиков в циклах счётчиках. 

В дополнение к пройденной теме по негласным правилам формирования идентификаторов стоит добавить, что в циклах счётчиках, как правило, для переменной счётчика используют идентификатор i. Пример: 

 

fo (var i = 0; i < 10; i = i+1) {   }; 

 

В дальнейшем мы узнаем, что массивы могут быть двумерными, трёхмерными и т.д. Для обработки таких массивов используются вложенные циклы счётчики. В качестве идентификаторов переменным счётчикам, как правило, для вложенных циклов используют буквы по алфавиту i,j,k,l,m и т.д. Пример: 

 

fo (var i = 0; i < 10; i = i+1) 

  fo (var j = 0; j < 10; j = j+1) 

    fo (var k = 0; k < 10; k = k+1) 

      fo (var l = 0; l < 10; l = l+1) 

        { 

          //Какие либо вычисления 

        }; 

  

Досрочный выход из цикла. Инструкция break. 

Бывают ситуации, когда из цикла необходимо выйти, не дожидаясь выполнения условия выхода. Для этого существует инструкция break. Для примера можно привести программу поиска элемента в массиве. Программа для поиска будет входить в цикл счётчик и выходить из него либо найдя нужный элемент, либо закончив перебор всех элементов. 

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

Пример программы: 

 

................... 

//Данный объект будет содержать index найденного элемента 

//Если свойство b равно false, значит 

//нужного элемента нет 

var found_element = {b:false,i:0}; 

 

//Переменная с нужным значением для поиска 

var necessary_value = 10; 

 

//Ищем элемент 

for (var c = 0;c<size_m;c = c+1) 

  if (mass[c] == necessary_value) 

  { 

    found_element.b = true; 

found_element.i = c; 

break; 

  }; 

 

//Выводим результат 

if (found_element.b) 

  document.write('Элемент со значением ', 

     necessary_value,' существует. Его', 

 ' индекс - ',found_element.i) 

else 

  document.write('Элемента со значением ', 

     necessary_value,' не существует.'); 

 

</script> 

 

 

Примечание, за основу данного примера была взята программа сортировка массива из 6 параграфа. 

 

Пропуск прохода цикла. Инструкция continue. 

Помимо досрочного выхода из цикла, бывают случаи, когда необходимо пропустить тот или иной проход. Для этого существует инструкция continue. Для примера перепишем цикл поиска элемента из предыдущего примера с использованием данной инструкции: 

 

//Ищем элемент 

for (var c = 0;c<size_m;c = c+1) 

{ 

  if (mass[c] != necessary_value) continue; 

  found_element.b = true; 

  found_element.i = c; 

  break; 

}; 

Результат не измениться. 

 

Оператор, операнд. Унарный, бинарный и тернарный операторы. 

Прежде чем приступить к следующей теме вспомним и введём несколько понятий. 

Операторэлементарная операция, составляющая основу языка. 

Операнд – элемент или элементы, над которым оператор производит операцию. 

Унарный оператор – оператор, производящий операцию над одним операндом. 

Бинарный оператор – оператор, производящий операцию над двумя операндами. 

Тернарный оператор – оператор, производящий операцию над тремя операндами (пример оператор ?:). 

 

Оператор присваивания (=). 

Символ равно «=», которым мы постоянно пользуемся, в JavaScript является оператором присваивания. Этот оператор присваивает значение операнду, находящемуся слева от него, значение, которое находится справа. 

 

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

Во втором параграфе мы познакомились с простыми арифметическими операциями. Сам термин «арифметическая операция» не совсем верен. Теперь вместо него будем использовать термин «арифметический оператор». Далее в таблице приведены все существующие в JavaScript арифметические операторы: 

 

Символ оператора 

Название оператора 

+ 

Сложение 

- 

Вычитание 

* 

Умножение 

/ 

Деление 

- 

Унарный минус 

+ 

Унарный плюс 

% 

Остаток от деления 

++ 

Инкремент 

-- 

Декремент 

 

Операторами +,-,*,/ мы уже успешно пользуемся. По ним вопросов не должно быть. Остальные операторы требуют пояснения. 

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

Унарный плюс (+) то же самое, что и унарный минус только наоборот. Как правило, в его использовании нет необходимости. 

Остаток от деления (%) возвращает остаток от деления первого числа на второе. Пример: 

 

<script> 

var r = 10%3; 

document.write('10 % 3 = ',r); 

r = 10.1%2.9; 

document.write('<br>10.1 % 2.9 = ',r); 

</script> 

 

 

Инкремент (++) – унарный оператор, который увеличивает операнд на единицу. Пример: 

 

var i = 10; 

i++; 

//Теперь i = 11 

//i++ то же самое, что i = i+1 

 

Этот оператор можно использовать как перед операндом, так и после.. Разница показана в примере: 

 

<script> 

var i = 10;  

var k; 

k = ++i; 

document.write('i = 10 <br> k = ++i = ',k,'<br> i = ',i,'<br>'); 

var i = 10; 

k = i++; 

document.write('<br>i = 10 <br> k = i++ = ',k,' <br> i = ',i); 

</script> 

 

 

Как видно из примера, если инкремент находится слева от операнда, то вначале операнд увеличивается на единицу, а затем значение операнда присваивается оператором присваивания. И наоборот, если инкремент находится справа от операнда, то вначале значение операнда присваивается оператором присваивания, а затем операнд увеличивается на единицу. 

Здесь стоит заметить, что в циклах счётчиках как раз и пользуются инкрементом для увеличения переменной счётчика. Пример: 

 

fo (var i = 0; i<10; i++) {}; 

 

Декремент (--) - оператор, который уменьшает операнд на единицу. Всё, что было сказано про инкремент, относится и к декременту. 

 

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

В JavaScript есть операторы присваивания с операцией. Далее в таблице приведены некоторые из них. Там же приведены эквивалентные выражения. 

 

Оператор 

Пример 

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

+= 

a+=2 

a=a+2 

-= 

a-=2 

a=a-2 

*= 

a*=2 

a=a*2 

/= 

a/=2 

a=a/2 

%= 

a%=2 

a=a%2 

 

Задачи. 

1. Опытным путём проверить разницу по времени в работе инкремента по сравнению с эквивалентным выражением. Сделать это можно создав несколько вложенных циклов счётчиков и замерив время их выполнения.  

Для решения данной задачи вам потребуются три метода объекта date: 

date.toLocaleTimeString()возвращает строку со временем, содержащемся в объекте; 

date.getMilliseconds() – возвращает количество миллисекунд, содержащихся в объекте (целое число от 0 до 999); 

date.getSeconds() – возвращает количество секунд содержащихся в объекте (целое число от 0 до 59). 

Сам объект date создаётся конструктором Date и содержит в себе дату (день, месяц, год) и время (час, минуты, секунды и миллисекунды) на момент создания. Более подробно об этом объекте речь поёдёт 14 параграфе. 

Далее пример использования трёх вышеперечисленных методов данного объекта: 

 

<script> 

var date_1 = new Date(); 

document.write('Сейчас ',date_1.toLocaleTimeString(), 

                и ',date_1.getMilliseconds(), 

                ' миллисекунд'); 

</script> 

 

 

Примечания: не забудьте, что объект созданный конструктором Date содержит в себе именно то время, когда он был создан. Т.е. что бы в нём появилось новое время, необходимо его снова создать конструктором Date. 

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

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

 

Примеры решений. 

1. 

<script> 

//Проверка без использования инкремента 

function  verification_without() 

{    

  var start = new Date();//Время начала работы цикла 

  //Вывод начала времени 

  document.write('Без инкремента начали в ', 

                  start.toLocaleTimeString(),'  ', 

                  start.getMilliseconds(),'<br>'); 

  //Сам цикл 

  for (var i = 0; i<1000; i = i+1)  

    for (var j = 0; j<1000; j = j+1)  

      for (var k = 0; k<1000; k = k+1); 

  var end = new Date();//Время конца цикла 

  //Вывод начала времени 

  document.write('Закончили в ', 

                  end.toLocaleTimeString(),'  ', 

                  end.getMilliseconds(),'<br>'); 

  var dSE;//Разница между началом и концом цикла 

  dSE = (end.getSeconds()*1000+end.getMilliseconds()) - 

        (start.getSeconds()*1000+start.getMilliseconds()); 

  //Выводим время работы цикла 

  document.write('Разница составила ',dSE,' миллисекунд.'); 

  document.write('<br><br>'); 

  return dSE;//Возрващаем время работы цикла 

} 

 

//Проверка с использованием инкремента 

function verification_with() 

{ 

  var start = new Date();//Время начала работы цикла 

  //Вывод начала времени 

  document.write('С инкрементом начали в ', 

                  start.toLocaleTimeString(),'  ', 

                  start.getMilliseconds(),'<br>'); 

  //Сам цикл 

  for (var i = 0; i<1000; i++)  

    for (var j = 0; j<1000; j++ 

      for (var k = 0; k<1000; k++); 

  var end = new Date();//Время конца цикла 

  //Вывод начала времени 

  document.write('Закончили в ', 

                  end.toLocaleTimeString(),'  ', 

                  end.getMilliseconds(),'<br>'); 

  var dSE;//Разница между началом и концом цикла 

  dSE = (end.getSeconds()*1000+end.getMilliseconds()) - 

        (start.getSeconds()*1000+start.getMilliseconds()); 

  //Выводим время работы цикла 

  document.write('Разница составила ',dSE,' миллисекунд.'); 

  document.write('<br><br>'); 

  return dSE;//Возрващаем время работы цикла 

} 

 

 

var average;//Сумма времени работы всех проверок 

average = verification_with(); 

average += verification_with(); 

average += verification_with(); 

document.write('Среднее время с инкрементом составило ', 

                average/3,' миллисекунд.<br><br><br>'); 

 

average = verification_without(); 

average += verification_without(); 

average += verification_without(); 

document.write('Среднее время без инкремента составило ', 

                average/3,' миллисекунд.<br><br><br>'); 

 

</script>