Лексическая структура
Содержание
- Лексема
- Набор символов
- Чувствительность к регистру
- Strict mode
- Символы-разделители и переводы строк
- Необязательные точки с запятой
- Комментарии
- Литералы
- Идентификаторы
- Операнд
- Операция
- Выражение
- Строка кода
- Оператор(условная инструкция, условный оператор, условная конструкция)
- Ключевое слово
- Зарезервированное слово
- Дополнительный материал
Лексема
Лексема(токен) — это минимальная часть языка, имеющая самостоятельный смысл. В JavaScript к лексемам относятся: разделители, идентификаторы, литералы, операции, операторы и т.д. Лексемы располагаются между разделителями (пробелами, табуляцией или переносом строки). Интерпретатор разделяет код программы на лексемы и затем собирает из них осмысленные конструкции. Примеры лексем:
var myLexeme; // тут 4 лексемы (var, пробел, myLexeme, точка с запятой)
myLexeme = "строка"; // тут 6 лексем
Набор символов
При написании программ на JavaScript используется набор символов Unicode.
В отличие от 7-разрядной кодировки ASCII, подходящей только для английского языка, и 8-разрядной кодировки ISO Latin-1, подходящей только для английского и основных западноевропейских языков, 16-разрядная кодировка Unicode обеспечивает представление практически любого письменного языка.
Стандарт ECMAScript 3 требует, чтобы реализации JavaScript обеспечивали поддержку стандарта Юникода версии 2.1 или выше, а стандарт ECMAScript 5 требует, чтобы реализации обеспечивали поддержку стандарта Юникода версии 3 или выше.
Эта возможность важна для интернационализации и особенно для программистов, не говорящих на английском языке.
Экранированные последовательности Unicode
alert('\u058D');
\u0061\u006C\u0065\u0072\u0074('hello');
Чувствительность к регистру
JavaScript - это язык, чувствительный к регистру.
Это значит, что ключевые слова, переменные, имена функций и любые другие идентификаторы языка должны всегда содорясать одинаковые наборы прописных и строчных букв. Например, ключевое слово while должно набираться как «while», а не «While» или «WHILE». Аналогично online. Online, OnLine и ONLlNE - это имена четырех разных переменных.
while
While
WHILE
WhiLe
Однако, язык HTML, в отличие от JavaScript, нечувствителен к регистру. По причине близкой связи HTML и клиентского JavaScript это различие может привести к путанице. Многие JavaScript-объекты и их свойства имеют те же имена, что и теги и атрибуты языка HTML, которые они обозначают. Если в HTML эти теги и атрибуты могут набираться в любом регистре, то в JavaScript они обычно должны набираться строчными буквами. Например, атрибут обработчика события oncl ick чаще всего задается в HTML как onCl ick, однако в JavaScript-коде (или в XHTML-доку менте) он должен быть обозначен как onclick.
Strict Mode
>>> more about Strict. Link on MDN <<<
Режим strict (строгий режим), введенный в ECMAScript 5, позволяет использовать более строгий вариант JavaScript. Это не просто подмножество языка: в нем сознательно используется семантика, отличающаяся от обычно принятой. Не поддерживающие строгий режим браузеры будут по-другомувыполнять код, написанный для строгого режима, поэтому не полагайтесь на строгий режим без тестирования поддержки используемых особенностей этого режима. Строгий и обычный режим могут сосуществовать одновременно, а скрипт может переключаться в строгий режим по мере надобности.
Строгий режим принёс ряд изменений в обычную семантику JavaScript. Во-первых, строгий режим заменяет исключениями некоторые ошибки, которые интерпретатор JavaScript ранее молча пропускал. Во-вторых, строгий режим исправляет ошибки, которые мешали движкам JavaScript выполнять оптимизацию -- в некоторых случаях код в строгом режиме может быть оптимизирован для более быстрого выполнения, чем код в обычном режиме. В-третьих, строгий режим запрещает использовать некоторые элементы синтаксиса, которые, вероятно, в следующих версиях ECMAScript получат особый смысл.
Пробелы, переводы строк и символы управления форматом(cимволы-разделители).
JavaScript игнорирует пробелы, табуляции и переводы строк, присутствующие между лексемами в программе.
Поэтому символы пробела, табуляции и перевода строки могут 6eз ограничений использоваться в исходных текстах программ для форматирования и придания им удобочитаемого внешнего вида.
Таблица пробельных символов
| Name | Abbreviation | Description | Escape sequence | |
|---|---|---|---|---|
| U+0009 | Character tabulation | <HT> | Горизонтальная табуляция | \t |
| U+000B | Line tabulation | <VT> | Вертикальная табуляция | \v |
| U+000C | Form feed | <FF> | Символ контроля разрыва страницы (Wikipedia) | \f |
| U+0020 | Space | <SP> | Обычный пробел | |
| U+00A0 | No-break space | <NBSP> | Обычный пробел без точки, на которой может произойти разрыв страницы |
Символы окончания строк
| Code point | Name | Abbreviation | Description | Escape sequence |
|---|---|---|---|---|
| U+000A | Line Feed | <LF> | Новая строка в UNIX системах. | \n |
| U+000D | Carriage Return | <CR> | Новая строка в Commodore и ранних Mac systems. | \r |
Однако имеется небольшое ограничение, которое касается символов перевода строк и о котором рассказывается далее.
Необязательные точки с запятой
>>> больше о необязательной точке с запятой ASI <<<
Простые JavaScript-инструкции обычно свершаются символами точки с запятой (;), как в С, C++ и Java. Точка с запятой служит для отделения инструкций друг от друга. Однако в JavaScript точку с запятой можно не ставить, если каждая инструкция помещается в отдельной строке- Например, следующий фрагмент может быть записан без точек с запятой:
a = 3
b = 4
Однако если обе инструкции расположены в одной строке, то первая точка с занятой должна присутствовать обязательно:
a = 3; b = 4;
Пропуск точек с запятой нельзя признать правильной практикой программирования, и поэтому желательно выработать привычку их использовать.
Теоретически JavaScript допускает переводы строк между любыми двумя лексемами, но привычка синтаксического анализатора JavaScript автоматически вставлять точки с запятой за программиста приводит к некоторым исключениям из этого правила. Если в результате разделения строки программного кода та ее часть, которая предшествует символу перевода, оказывается законченной инструкцией, синтаксический анализатор JavaScript может решить, что точка с запятой пропущена случайно, и вставить ее, изменив смысл программы. К подобным требующим внимания ситуациям относятся, среди прочих, инструкции return, break и continue. Рассмотрим, например, следующий фрагмент:
return
true;
Синтаксический анализатор JavaScript предполагает, что программист имеет в виду следующее:
return;
true;
Хотя на самом деле программист, видимо, хотел написать
return true;
Вот случай, когда следует быть внимательным, данный код не вызовет синтаксической ошибки, но приведет к неочевидному сбою. Похожая неприятность возникает, если написать:
break
outerloop;
JavaScript вставляет точку с занятой после ключевого слова break, что вызывает синтаксическую ошибку при попытке интерпретировать следующую строку. По аналогичным причинам постфиксные операторы ++ и -- должны располагаться в той же строке, что и выражения, к которым они относятся.
Комментарии
// Комментарий, занимающий одну строку.
/* Комментарий,
занимающий несколько строк.
*/
/* Нельзя вкладывать /* комментарий в комментарий */ SyntaxError */
Литералы
Литерал — это значение переменной заданное программистом, оно может быть числом, строкой, логическим значением (true/false), регулярным выражением (для поиска по шаблону) и т.д.
Значение созданное программой, литералом не является.
Примеры литералов:
var myLiteral;
myLiteral = "строка";
myLiteral = число;
myLiteral = true;
// Числовые
12 // Число двенадцать
1.2 // Число одна целая две десятых
// Строковые
"hello world" // Строка текста
"Hi" // Другая строка
// Булевые или логические
true // Логическое значение
false // Другое логическое значение
// RegExp или регулярные выражения
/javascript/gi // Регулярное выражение (для поиска по шаблону)
// литерал null
null // Отсутствие обьекта
// литерал объект
{ х:1, у:2 } // Инициализатор объекта
// литерал массив
[1, 2, 3, 4, 5] // Инициализатор массива
Идентификаторы
Идентификатор — это уникальное имя переменной, константы, пользовательской функции, объекта, массива, ключевых и зарезервированных слов, меток и т.д. Примеры идентификаторов:
var myIdentifier; // тут два идентификатора (var и myIdentifier)
function myIdentifier() { } // тут два идентификатора
В JavaScript идентификаторы выступают и качество названий переменных и функций, а также меток некоторых циклов.
Правила формирования допустимых идентификаторов следующие.
Первым символом должна быть буква, символ подчеркивания ( _ ) или знак доллара ( $ ).
Последующие символы могут быть любой буквой, цифрой, символом подчеркивания или знаком доллара.
Цифра не может быть первым символом, т. к. тогда интерпретатору труднее отличать идентификаторы от чисел.
// Правильно
a
my_variable_name
v13
_dummy
$str
\u03c0 // юникод символа π -(пи)
// НЕ ДОПУСТИМО
1name
2name
В EKMAScript v3 идентификаторы могут содержать буквы и цифры из полного набора символов Unicode. До этой версии стандарта JavaScript-идентификаторы были ограничены набором ASCII.
ECMAScript v3 также допускает наличие в идентификаторах escape-последовательностей Unicode - символов \u, за которыми расположены i шестнадцатеричные цифры, обозначающие 16-разрядный код символа. Например, идентификатор π можно записать как \u03c0. Этот синтаксис неудобен, но обеспечивает возможность транслитерации JavaScript-программ с Unicode-символами в форму, допускающую работу с ними в текстовых редакторах и других средствах, не поддерживающих полный набор Unicode.
Наконец, идентификаторы не могут совпадать ни с одним из ключевых слов, предназначенных в JavaScript для других целей.
Зарезервированные ключевые слова в ECMAScript 2015
breakcaseclasscatchconstcontinuedebuggerdefaultdeletedoelseexportextendsfinallyforfunctionifimportininstanceofletnewreturnsuperswitchthisthrowtrytypeofvarvoidwhilewithyieldКлючевые слова, зарезервированные на будущее
Следующие ключевые слова зарезервированы на будущее ECMAScript спецификацией. За ними сейчас не стоит никакой функциональности, но она может появиться в будущих версиях, поэтому эти ключевые слова не могут быть использованы, как идентификаторы. Эти ключевые слова не могут быть использованы даже в strict или non-strict режимах.
enum
awaitСледующие ключевые слова зарезервированы для кода, который выполняется в strict режиме:
implements
package
protected
static
interface
private
publicЗарезервированные ключевые слова в более старых версиях
Перечисленные ниже ключевые слова зарезервированы для старых версий ECMAScript спецификаций (ECMAScript от 1 по 3).
abstractbooleanbytechardoublefinalfloatgotointlongnativeshortsynchronizedtransientvolatile
Операнд
Операнд — это левая или правая часть операции. Примеры операндов:
var myOperand;
myOperand = 8 + 2; // здесь в качестве операндов выступают myOperand, 8 и 2
Здесь в качестве операций выступают: + и =, в качестве выражений: 8 + 2 и myOperand = 10, в качестве строки кода (инструкции): myOperand = 8 + 2;
Операция
Операция — это специальные знаки которые манипулируют операндами, например: плюс +, минус -, больше <, меньше > и т.д. Примеры операций:
var myOperator;
myOperator = 7 + 3; // здесь в качестве операций выступают = и +
Операции могут быть арифметическими, сравнения, логическими и т.д.
Выражения
Выражение — это комбинация операндов и операций, которая может быть вычислена интерпретатором для получения значения. Примеры выражений:
5 + 7 // + операция, 5 и 7 операнды
(6 - 2) * 5 // - и * операции, (6 - 2) и 5 операнды
Строка кода
Строка кода (команда, инструкция), указывает совершить какое либо действие, оканчивается точкой с запятой. Пример инструкции x = y + z; Разница между инструкцией и выражением, состоит в том, что выражение вычисляет, но ничего не делает, не изменяет программу, а строка кода изменяет.
Оператор
Оператор — под операторами обычно имеют ввиду операторы ветвления: if, else, switch, операторы циклов: for, while, do while. Оператор ветвления также еще назвают: условной инструкцией, условным оператором, условной конструкцией.
Ключевое слово
Ключевое слово — это часть синтаксиса ядра языка, так называемый предопределённый идентификатор. Его нельзя использовать в качестве имени идентификатора. Примеры ключевых слов: break, delete, function, if и т.д.
Зарезервированное слово
Зарезервированное слово — это часть синтаксиса ядра языка, которое планируется использовать в будущем, использовать их в качестве идентификатора не рекомендуется. Примеры зарезервированных слов: const, import, int, long и т.д.
Дополнительный материал
Объявление переменной — это создание переменной.
Инициализация переменной — это присваивание переменной какого-либо значения.
Тип данных — это значение присваиваемой переменной, может быть числом, строкой, булевым выражением (true, false) и т.д.
NaN — Not a Number (не число), значение (тип данных) не являющееся числом. NaN появляется, когда в вычислениях появляется ошибка связанная с тем, что один из операндов арифметической операции не имеет числового типа данных. Пример:
var myVariable = "Строка";
alert(5 * myVariable); // выведет NaN
undefined (неопределённая) — состояние не инициализированной переменной. Появляется когда в сценарии участвует переменная которой не присвоили значения. Пример:
var myVariable;
alert(myVariable); // выведет undefined
Переменная объявлена, но не инициализирована, значение у неё undefined. В логическом контексте undefined принимает значение false, в числовом NaN, в строковом "undefined"
null — это значение которое не имеет типа данных. Например null может появится, при нажатии в модальном окне на кнопку «Отмена», данное окно вызывается с помощью функции promt();. В логическом контексте, nul принимает значение false, в числовом 0, в строковом "null"
Конкатенация — это операция соединения строк, в качестве операции выступает знак плюс +. Для того чтобы произошла операция конкатенации, нужно чтобы один или два операнда имели тип данных string. Пример:
alert("5" + 3);
Данная функция выведет «53», а не 8, поскольку один из операндов имеет тип данных, строка.
Интерпретатор — это специальная программа, которая понимает код языка и выполняет его команды.