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
.
Подробности: Функции, Стрелочные функции, основы.