Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие 800290

.pdf
Скачиваний:
9
Добавлен:
01.05.2022
Размер:
1.34 Mб
Скачать

vаr qw = 42; // сейчас qw типа Number vаr qw = "car"; // а теперь qw типа String

vаr qw o = true; // qw становится типа Boolean

Инициализатор — это любое выражение, значение которого присваивается переменной при ее создании.

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

Выражения и операции

Выражения в JavaSсript, как и в других языках программирования, представляют собой комбинации переменных, констант и операций, дающие осмысленный результат. Этот результат может быть числом, текстовой строкой, логическим значением или объектом. Соответственно все выражения JavаScript подразделяются на арифметические, строковые, логические и объектные.

Существует два типа выражений: те, которые присваивают значение некоторой переменной (например, x = 2 + 3), и те, которые просто имеют некое значение (например, 2 + 3). Первый тип выражений называется операциями присваивания.

Все операции в JavaSсript подразделяются на следующие:

операции сравнения;

арифметические операции;

битовые операции;

логические операции;

строковые операции;

операции присваивания;

прочие операции.

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

операции «больше», «меньше», «не больше» и «не меньше» сначала пытаются преобразовать операнды в числа, а, если это невозможно, то в строки, а затем производят их сравнение;

операции «равно» и «не равно» пытаются преобразовать операнды в строки, затем в числа и в логические значения, а затем производят их сравнение;

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

11

Таблица 3

Операции сравнения

Оператор

 

Описание

Примеры,

 

 

возвращающие true

 

 

 

 

 

 

 

 

 

 

 

 

3

==

var1

Равно (==)

 

Возвращает true, если операнды равны

"3"

==

var1

 

 

 

3 == '3'

 

 

 

 

 

 

 

 

Не равно (!=)

Возвращает true, если операнды не равны

var1

!=

4

var2 != "3"

 

 

 

 

 

 

 

 

 

 

Строго

 

Возвращает true, если операнды равны и имеют оди-

3 === var1

 

равно (===)

наковый тип. См. также Object.is и sameness in JS

 

 

 

 

 

 

 

 

 

Строго

не

Возвращает true, если операнды не равны и/или

var1

!==

"3"

равно(!==)

 

имеют разный тип.

3 !== '3'

 

 

 

 

 

 

 

Больше (>)

Возвращает true, если операнд слева больше операн-

var2

>

var1

да справа.

"12" > 2

 

 

 

 

 

 

 

 

 

 

Больше

или

Возвращает true, если операнд слева больше или ра-

var2

>=

var1

равно (>=)

 

вен операнду справа.

var1 >= 3

 

 

 

 

 

 

 

Меньше (<)

Возвращает true, если операнд слева меньше операн-

var1

<

var2

да справа.

"2" < 12

 

 

 

 

 

 

 

 

 

 

Меньше

или

Возвращает true, если операнд слева меньше или ра-

var1

<=

var2

равно (<=)

 

вен операнду справа.

var2 <= 5

 

 

 

 

 

 

 

Арифметические операции применяются к числовым операндам и возвращают числовое значение, означающее результат операции. Если типы операндов различны, то делается попытка преобразовать их к числовому типу.

При этом:

операция «сложение» выполняется только тогда, когда оба операнда являются числами или логическими значениями. Если хотя бы один операнд является строкой, то производится конкатенация строк;

остальные операции преобразуют операнды в числа, а затем выполняют операцию;

операции «инкремент» и «декремент» применяются только к переменным.

12

Таблица 4

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

Оператор

Имя

Функция

 

 

Пример

 

 

 

 

 

 

 

 

 

 

+

сложение

Объединение чисел в одно целое.

6

+ 9

 

 

 

 

 

 

 

 

 

 

-

вычитание

Вычитает правое число от левого.

20 - 15

 

 

 

 

 

 

 

 

 

 

 

*

умножение

Умножает два числа вместе.

3

* 7

 

 

 

 

 

 

 

 

 

 

/

деление

Делит левое число на правое.

10 / 5

 

 

 

 

 

 

 

 

 

 

 

 

Возвращает значение остатка при

11

%

3

=

 

модуль

делении первого числа на второе.

2

(поскольку число 3

%

Результат

будет иметь

тот же

вмещается

три

раза,

числа

 

знак, что и первое число.

 

остатком будет число

 

 

 

 

 

 

 

 

2)

 

 

 

 

 

 

 

 

 

 

 

Возводит базовое число в указан-

5

**

5 (возвращает

 

 

ную степень, то есть количество

3125,

или

как:

**

показатель

базовых чисел, указанных экспо-

5*5*5*5*5)

 

 

степени

нентой,

умножается

вместе.

 

 

 

 

 

 

 

 

 

 

 

 

 

Впервые он был представлен в ES

 

 

 

 

 

 

 

2016.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

При этом:

операция «сложение» выполняется только тогда, когда оба операнда являются числами или логическими значениями. Если хотя бы один операнд является строкой, то производится конкатенация строк;

остальные операции преобразуют операнды в числа, а затем выполняют операцию;

операции «инкремент» и «декремент» применяются только к пере-

менным.

На сегодняшний день JavaSсript поддерживает единственную строковую операцию, а именно конкатенацию строк, которая обозначается символом «+». Если хотя бы один операнд является строкой, то результатом операции является слияние строк-операндов.

Битовые операции применяются к числовым операндам, представленным как двоичные числа (т. е. как цепочки из 32 битов), и возвращают числовое значение, означающее результат операции. Перед выполнением операции операнды преобразуются в целые числа, а результат операции преобразуется в

Number.

13

Таблица 5

Битовые операции

Оператор

Использовани

Описание

 

е

 

 

 

 

Побитовое И

a & b

Возвращает 1 в тех разрядах, которые у

обоих операндов были равны 1.

 

 

 

 

 

 

 

Возвращает 1 в тех разрядах, которые хо-

Побитовое ИЛИ

a | b

тя бы у одного из операндов были равны

 

 

1.

 

 

 

 

 

Возвращает 1 в тех позициях, которые

Побитовое исключающее ИЛИ

a ^ b

только у одного из операндов были равны

 

 

1.

 

 

 

Побитовое НЕ

~ a

Инвертирует биты операнда.

 

 

 

 

 

Сдвигает двоичное представление числа a

Сдвиг влево

a << b

на b разрядов влево заполняя освободив-

 

 

шиеся справа разряды нулями.

 

 

 

 

 

Сдвигает двоичное представление числа a

Арифметический сдвиг вправо

a >> b

на b разрядов вправо. Освобождающиеся

 

 

разряды заполняются знаковым битом.

 

 

 

 

 

Сдвигает двоичное представление числа a

Логический сдвиг вправо

a >>> b

на b разрядов вправо. Освобождающиеся

 

 

разряды заполняются нулями.

 

 

 

Логические операции применяются к логическим операндам и возвращают логическое значение, означающее результат операции. Если типы операндов различны, то делается попытка преобразовать их к логическому типу.

Таблица 6

Логические операции

Оператор

Использование

Описание

 

 

 

 

 

Возвращает значение expr1, если оно может

 

 

быть преобразовано в false; иначе возвраща-

 

 

ет значение expr2. Таким образом, при ис-

Логическое И (&&)

expr1 && expr2

пользовании с величинами типа Boolean

 

 

оператор && вернет true, если оба операнда

 

 

могут быть преобразованы в true; иначе опе-

 

 

ратор && вернет false.

 

 

 

14

Продолжение табл. 6

Оператор

Использование

Описание

 

 

 

 

 

 

 

 

Возвращает значение expr1, если оно может

 

 

быть преобразовано в true; иначе возвраща-

Логическое ИЛИ (||)

expr1 || expr2

ет значение expr2. Таким образом,

при ис-

пользовании с величинами типа Boolean

 

 

 

 

оператор || вернет true если хоть один из них

 

 

равен true; в других случаях вернет false.

 

 

 

 

 

 

 

 

Возвращает

false

если

значе-

Логическое НЕ (!)

!expr

ние expr можно привести к true; в противо-

 

 

положном случае возвращает true.

 

 

 

 

 

 

 

Операции присваивания присваивают левому операнду результат операции, который определяется правым операндом и самой операцией. Базовая операция присваивания имеет вид a = b, что означает: присвоить переменной a значение операнда b.

 

 

 

 

 

 

 

Таблица 7

 

Операции присваивания

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Имя

 

 

Сокращенный

 

 

Смысл

 

 

 

оператор

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Присваивание

 

 

x = y

 

 

x = y

 

 

 

 

 

 

 

 

 

 

Присваивание со сложением

 

 

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

 

 

 

 

 

 

 

 

 

 

Присваивание с левым сдвигом

 

 

x <<= y

 

 

x = x << y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Присваивание с правым сдвигом

 

 

x >>= y

 

 

x = x >> y

 

 

 

 

 

 

 

 

 

 

Присваивание с беззнаковым сдвигом

 

 

x >>>= y

 

 

x = x >>> y

вправо

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Присваивание с побитовым AND

 

 

x &= y

 

 

x = x & y

 

 

 

 

 

 

 

 

 

 

Присваивание с побитовым XOR

 

 

x ^= y

 

 

x = x ^ y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Присваивание с побитовым OR

 

 

x |= y

 

 

x = x | y

 

 

 

 

 

 

 

 

 

 

15

Прочие операции включают большой набор разнообразных операций, к которым относятся такие операции, как условная операция, операция запятая, операция delete, операция new и другие. Более подробно узнать о них моно по одной из предложенных в конце раздела ссылок.

Управляющие конструкции языка JavaSсript

Условный оператор IF

Не все программы являются прямыми дорогами. Например, мы можем захотеть создать ветвящуюся дорогу, где программа выбирает правильную ветвь в зависимости от ситуации. Это называется условным исполнением.

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

let theNumber = Number(prompt("Pick a number")); if (!Number.isNaN(theNumber)) {

console.log("Your number is the square root of " + theNumber * theNumber);

}

С этой модификацией, если вы введете «parrot», никакой вывод не отображается.

Ключевое слово if выполняет или пропускает оператор в зависимости от значения логического выражения. Решающее выражение записывается после ключевого слова в скобках, за которым следует инструкция для выполнения.

Функция Number.isNaN — это стандартная функция JavaScript, которая возвращает true только в том случае, если задан аргумент NaN. Функция Number возвращает значение NaN, когда вы даете ей строку, которая не представляет действительное число. Таким образом, условие переводится как «если theNumber не является числом, делайте это».

Оператор после if в этом примере заключен в фигурные скобки ({и}). Скобки можно использовать для группировки любого количества операторов в один оператор, называемый блоком. Вы также могли бы опустить их в этом случае, так как они содержат только один оператор, но чтобы избежать необходимости думать о том, нужны ли они, большинство программистов JavaScript используют их в каждом заключенном в оболочку выражении, подобном этому. Мы в основном будем придерживаться этого соглашения в этой книге, за исключением случайных однострочных.

if (1 + 1 == 2) console.log("It's true"); // → It's true

16

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

Если у вас есть более двух путей на выбор, вы можете «связать» несколько пар if / else вместе. Вот пример:

let num = Number(prompt("Pick a number")); if (num < 10) {

console.log("Small");

}else if (num < 100) { console.log("Medium");

}else { console.log("Large");

}

Программа сначала проверит, меньше ли num, чем 10. Если это так, она выбирает эту ветвь, показывает «Small» и все готово. Если это не так, он принимает ветвь else, которая сама содержит секунду if. Если второе условие (<100) выполняется, это означает, что число находится в диапазоне от 10 до 100, и отображается «Среднее». Если это не так, выбирается вторая и последняя ветвь.

Оператор цикла DO/WHILE

Рассмотрим программу, которая выводит все четные числа от 0 до 12. Один из способов написать это следующим образом:

console.log(0);

console.log(2);

console.log(4);

console.log(6);

console.log(8);

console.log(10);

console.log(12);

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

Зацикливание потока управления позволяет нам вернуться к некоторой точке программы, где мы были раньше, и повторить ее с нашим текущим со-

17

стоянием программы. Если мы объединяем это с привязкой, которая имеет значение, мы можем сделать что-то вроде этого:

let number = 0;

while (number <= 12) { console.log(number); number = number + 2;

}

//→ 0

//→ 2

//… etcetera

Оператор, начинающийся с ключевого слова while, создает цикл. За словом while следует выражение в скобках, а затем утверждение, очень похожее на if. Цикл продолжает вводить этот оператор до тех пор, пока выражение выдает значение, которое дает значение true при преобразовании в логическое значение.

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

В качестве примера, который действительно делает что-то полезное, теперь мы можем написать программу, которая вычисляет и показывает значение 210 (от 2 до 10-й степени). Мы используем две привязки: одну для отслеживания нашего результата и одну для подсчета того, как часто мы умножали этот результат на 2. Цикл проверяет, достигла ли вторая привязка еще 10, и, если нет, обновляет обе привязки.

let result = 1; let counter = 0;

while (counter < 10) { result = result * 2; counter = counter + 1;

}

console.log(result); // → 1024

Счетчик также мог бы начинаться с 1 и проверяться на <= 10, но по причинам, которые станут понятны в главе 4, хорошей идеей будет привыкнуть к счету от 0.

Цикл do - это структура управления, похожая на цикл while. Он отличается только одним моментом: цикл do всегда выполняет свое тело хотя бы один

18

раз и начинает тестировать, должен ли он останавливаться только после этого первого выполнения. Чтобы отразить это, тест появляется после тела цикла.

let yourName; do {

yourName = prompt("Who are you?"); } while (!yourName); console.log(yourName);

Эта программа заставит вас ввести имя. Он будет спрашивать снова и снова, пока не получит что-то, что не является пустой строкой. Применяя оператор преобразует значение в логический тип перед его отрицанием, а все строки, кроме "", преобразуются в true. Это означает, что цикл продолжается, пока вы не укажете непустое имя.

Оператор цикла FOR

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

Поскольку этот шаблон очень распространен, JavaScript и аналогичные языки предоставляют несколько более короткую и всеобъемлющую форму цикла for.

for (let number = 0; number <= 12; number = number + 2) { console.log(number);

}

//→ 0

//→ 2

//… etcetera

Эта программа в точности эквивалентна предыдущему примеру печати четных чисел. Единственное изменение состоит в том, что все операторы, связанные с «состоянием» цикла, группируются после for.

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

Это код, который вычисляет 210, используя вместо вместо:

19

let result = 1;

for (let counter = 0; counter < 10; counter = counter + 1) { result = result * 2;

}

console.log(result); // → 1024

Цикл for ... in используется для просмотра свойств объекта. Поскольку мы еще не обсуждали объекты, вам может не понравиться этот цикл. Но как только вы поймете, как объекты ведут себя в JavaScript, вы обнаружите, что этот цикл очень полезен.

for (variablename in object) { statement or block to execute

}

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

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

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

Эта программа иллюстрирует оператор break. Он находит первое число, которое больше или равно 20 и делится на 7.

for (let current = 20; ; current = current + 1) { if (current % 7 == 0) {

console.log(current);

break;

}

}

// → 21

Использование оператора remainder (%) - это простой способ проверить, делится ли число на другое число. Если это так, остаток от их деления равен нулю.

Конструкция for в этом примере не имеет части, которая проверяет конец цикла. Это означает, что цикл никогда не остановится, пока не будет выполнен оператор break внутри.

Если бы вы удалили этот оператор break или случайно написали условие завершения, которое всегда выдает true, ваша программа застряла бы в беско-

20