Лексическая структура

Содержание

Лексема

Лексема(токен) — это минимальная часть языка, имеющая самостоятельный смысл. В 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

  • break
  • case
  • class
  • catch
  • const
  • continue
  • debugger
  • default
  • delete
  • do
  • else
  • export
  • extends
  • finally
  • for
  • function
  • if
  • import
  • in
  • instanceof
  • let
  • new
  • return
  • super
  • switch
  • this
  • throw
  • try
  • typeof
  • var
  • void
  • while
  • with
  • yield

Ключевые слова, зарезервированные на будущее

Следующие ключевые слова зарезервированы на будущее ECMAScript спецификацией. За ними сейчас не стоит никакой функциональности, но она может появиться в будущих версиях, поэтому эти ключевые слова не могут быть использованы, как идентификаторы. Эти ключевые слова не могут быть использованы даже в strict или non-strict режимах.

  • enum
  • await

    Следующие ключевые слова зарезервированы для кода, который выполняется в strict режиме:

  • implements

  • package

  • protected

  • static

  • interface

  • private

  • public

Зарезервированные ключевые слова в более старых версиях

Перечисленные ниже ключевые слова зарезервированы для старых версий ECMAScript спецификаций (ECMAScript от 1 по 3).

  • abstract
  • boolean
  • byte
  • char
  • double
  • final
  • float
  • goto
  • int
  • long
  • native
  • short
  • synchronized
  • transient
  • volatile

Операнд

Операнд — это левая или правая часть операции. Примеры операндов:

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, поскольку один из операндов имеет тип данных, строка.

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

results matching ""

    No results matching ""