Лексическая структура
Содержание
- Лексема
- Набор символов
- Чувствительность к регистру
- 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
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, поскольку один из операндов имеет тип данных, строка.
Интерпретатор — это специальная программа, которая понимает код языка и выполняет его команды.