Learn JavaScript #11. Особенности JavaScript.
Давайте кратко повторим изученный материал и отметим наиболее "тонкие" моменты.
Структура кода
Инструкции разделяются точкой с запятой:
alert('Hello');
alert('World');Большинство руководств по стилю кода рекомендует ставить точку с запятой после каждой инструкции.
Точка с запятой не требуется после блоков кода {...} и синтаксических конструкций с ними, таких как, например, циклы:
function f() {
// после объявления функции необязательно ставить точку с запятой
}
for(;;) {
// после цикла точка с запятой также необязательна
}...Впрочем, если даже мы и поставим "лишнюю" точку с запятой, ошибки не будет. Она просто будет проигнорирована.
Подробности: Структура кода.
Строгий режим
Чтобы по максимуму использовать возможности современного JavaScript, все скрипты рекомендуется начинать с добавления директивы 'use strict'.
'use strict'; ...
Эту директиву следует размещать в первой строке скрипта или в начале тела функции.
Без 'use strict' код также запустится, но некоторые возможности будут работать в "режиме совместимости" со старыми версиями языка JS. Нам же предпочтительнее современное поведение.
Некоторые конструкции языка (например классы, которые нам ещё предстоит изучить) включают строгий режим по умолчанию.
Подробности: Строгий режим — "use strict".
Переменные
Имя переменной может включать:
- Буквы и цифры, однако цифра не может быть первым символом
- Символы
$и_используются наряду с буквами - Иероглифы и символы нелатинского алфавита также допустимы, но обычно не используются
Переменные типизируются динамически. В них могут храниться любые значения:
let x = 5; x = 'Vasya';
Всего существует 8 типов данных:
number- для целых и вещественных чисел,bigint- для работы с целыми числами произвольной длины,string- для строк,boolean- для логическим значений истинности или ложности: true/false,null- тип с единственным значением null, то есть "пустое значение" или "значение не существует",undefined- тип с единственным значением undefined, то есть "значение не задано"objectиsymbol- сложные структуры данных и уникальные идентификаторы. Их мы ещё не изучили.
Оператор typeof возвращает тип значения переменной, с двумя исключениями:
typeof null == 'object' // Ошибка в языке
typeof function(){} == 'function' // именно для функцийПодробности: Переменные, Типы данных.
Взаимодействие с посетителем
В качестве рабочей среды мы используем браузер, так что простейшими функциями взаимодействия с посетителем являются:
Задаёт вопрос question и возвращает то, что ввёл посетитель, либо null, если посетитель нажал на кнопку "Отмена".
Задаёт вопрос question и предлагает выбрать "ОК" или "Отмена". Выбор возвращается в формате true/false.
Все эти функции показывают модальные окна, они останавливают выполнение кода и не позволяют посетителю взаимодействовать со страницей, пока не будет дан ответ на вопрос.
let userName = prompt('Введите имя', 'Алиса');
let isTeaWanted = confirm('Вы хотите чаю?');
alert( 'Посетитель: ' + userName ); // Посетитель: Алиса
alert( 'Чай: ' + isTeaWanted); // Чай: true/false(в зависимости от выбора)Подробности: Взаимодействие: alert, prompt, confirm.
Операторы
JavaScript поддерживает следующие операторы:
Арифметические
Простые * + - /, а также деление по модулю % и возведение в степень **.
Бинарный плюс + объединяет строки. А если одним из операндов является строка, второй тоже будет конвертирован в строку:
alert( '1' + 2); // '12', строка alert( 1 + '2'); // '12', строка
Операторы присваивания
Простые a = b и составные a *= 2.
Битовые операции
Битовые операторы работают с 32-битными целыми числами на самом низком, побитовом уровне. Подробнее об их использовании можно прочитать на ресурсе MDN и в разделе Побитовые операторы.
Условный оператор
Единственный оператор с тремя параметрами: cond ? resultA : resultB. Если условие cond истинно, то возвращается resultA, иначе - resultB.
Логические операторы
Логические И &&, ИЛИ || используют так называемое "ленивое вычисление" и возвращают значение, на котором оно остановилось (не обязательно true или false). Логическое НЕ ! конвертирует операнд в логический тип и возвращает инвертированное значение.
Оператор нулевого слияния
Оператор ?? предоставляет способ выбора определённого значения из списка переменных. Результатом a ?? b будет a, если только оно не равно null/undefined, если всё же равно, тогда b.
Сравнение
Проверка на равенство == значений разных типов конвертирует их в число (за исключением null & undefined, которые могут равняться только друг другу), так что примеры ниже равны:
alert( 0 == false ); // true alert( 0 == '' ); // true
Другие операторы сравнения тоже конвертируют значения разных типов в числовой тип.
Оператор строгого равенства === не выполняет конвертирования: разные типы для него всегда означают разные значения.
Значения null & undefined особенные: они равны == только друг другу, но не равны ничему ещё.
Операторы сравнения больше/меньше сравнивают строки посимвольно, остальные типы конвертируются в число.
Другие операторы
Существуют и другие операторы, такие как запятая.
Подробности: Базовые операторы, математика, Операторы сравнения, Логические операторы, Оператор нулевого слияния (??).
Циклы
// 1
while (condition) {
...
}
// 2
do {
...
} while (condition);
// 3
for(let i = 0; 0 < 10; i++) {
...
}Переменная объявленная в цикле for(let...), видна только внутри цикла. Но мы также можем опустить let и переиспользовать существующую переменную.
Директивы break/continue позволяют выйти из цикла/текущей итерации. Используйте метки для выхода из вложенных циклов.
Подробности: Циклы while и for.
Позже мы изучим ещё виды циклов для работы с объектами.
Конструкция "switch"
Конструкция "switch" может заменить несколько проверок if. При сравнении она использует оператор строгого равенства ===.
let age = prompt('Сколько вам лет?', 18);
switch (age) {
case 18:
alert('Так не сработает'); // результатом prompt является строка 18
case "18":
alert('А так сработает!');
break;
default:
alert('Любое значение, неравное значению выше');
}Подробности: Конструкция "switch".
Функции
Мы рассмотрели три способа создания функции в JavaScript
function sum(a, b) {
let result = a + b;
return result;
}let sum = function(a, b) {
let result = a + b;
return result;
};// выражение в правой части
let sum = (a, b) => a + b;
// многострочный код в фигурных скобках {...}, здесь нужен return:
let sum = (a, b) => {
// ...
return a + b;
}
// без аргументов
let sayHi = () => alert('Hello');
// с одним аргументом
let double = n => n * 2;У функций могут быть локальные переменные, то есть объявленные в теле функции. Такие переменные видимы только внутри функции.
У параметров могут быть значения по умолчанию: function sum(a = 1, b =2) {...}.
Функции всегда что-нибудь возвращают. Если нет оператора return, то результатом будет undefined.
Подробности: Функции, Стрелочные функции, основы.