Лексический синтаксис
Этот раздел описывает синтаксис JavaScript. Исходный код ECMAScript скриптов сканируется слева направо и преобразуется в последовательность найденных элементов в токены, управляющие символы, окончания строк, комментарии или пробелы.
ECMAScript также определяет ключевые слова и литералы и имеет указания для автоматической вставки точек с запятой к концу инструкции.
Спецсимволы
Спецсимволы не имеют визуального представления, однако используются для управления интерпретацией текста.
| Code point | Name | Abbreviation | Description |
|---|---|---|---|
U+200C |
Zero width non-joiner | <ZWNJ> | Размещается между символами во избежание их соединений в лигатуры для некоторых языков (Wikipedia) |
U+200D |
Zero width joiner | <ZWJ> | Размещается между символами, которые не могли бы нормально объединиться для того, чтобы символы отрисовывались, используя их соединительную форму в некоторых языках (Wikipedia) |
U+FEFF |
Byte order mark | <BOM> | Используется вначале скрипта для того, чтобы пометить Юникод и порядок байтов (Wikipedia) |
Пробелы
Пробельные символы улучшают читабельность исходного текста и разделяет токены друг от друга. Пробельные символы обычно не обязательны для функционирования кода. Утилиты для уменьшения объёма кода часто удаляют пробельные символы, чтобы уменьшить объем кода.
| Code point | 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> | Обычный пробел без точки, на которой может произойти разрыв страницы | |
| Others | Other Unicode space characters | <USP> | Другие символы в Википедии |
Окончание строк
В дополнение к пробельным символам, символы окончания строк тоже используются для читабельности исходного кода. Однако, в некоторых случаях, символы окончания строк могут влиять на выполнение JavaScript-кода, т.к. есть некоторые места, где они запрещены.
Окончания строк также затрагивают процесс автоматического проставления точки с запятой. Также окончания строк попадают под условия регулярных выражений при поиске \s класса.
В ECMAScript, в качестве окончания строк можно использовать только ниже перечисленные Юникод символы. Другие символы окончания строк будут интерпретированы, как пробельные символы (например, Next Line, NEL, U+0085 будут интерпретироваться, как пробельные символы).
Комментарии
Комментарии используются для добавления подсказок, заметок, предложений или предупреждений. Они могут упростить чтение и понимание кода. Также они могут быть использованы для предотвращения выполнения кода (этот приём практикуется при отладке кода).
В JavaScript есть несколько способов указать комментарии в коде.
Первый способ // комментарий; в этом случае весь текст в строке после двойного слеша будет комментарием, например:
function comment() {
// Это комментарий в строке
console.log("Hello world!");
}
comment();
Второй способ - это /* */, такой способ более гибок, чем первый.
Например, вы можете использовать его в одной строке:
function comment() {
/* Это однострочный комментарий */
console.log("Hello world!");
}
comment();
Либо вы можете сделать многострочный комментарий, как показано здесь:
function comment() {
/* Этот комментарий располагается на нескольких линиях.
Обратите внимание, что вам не нужно обрывать комментарий, пока вы его не закончите*/
console.log("Hello world!");
}
comment();
Также, если пожелаете, то вы можете использовать такое комментирование посреди строки кода. Хотя это может ухудшить читабельность кода:
function comment(x) {
console.log("Hello " + x /* вставьте значение x */ + " !");
}
comment("world");
Чтобы отключить выполнение кода, просто оберните код в комментарий, как здесь:
function comment() {
/* console.log("Hello world!"); */
}
comment();
В этом случае console.log() никогда не выполнится, пока он внутри комментария. Таким способом можно отключить любое количество строк кода.
Шебанг комментарии
Третий специализированный синтаксис комментариев, шебанг комментарий, в процессе стандартизации в ECMAScript (смотреть Hashbang Grammar proposal).
Шебанг комментарий ведёт себя точно также как и однострочный (//) комментарий. Вместо этого, он начинается с #! и действителен только в самом начале скрипта или модуля. Обратите внимание, что никакие пробелы не разрешены перед #!. Комментарий состоит из всех символов после #! до конца первой строки; только такой комментарий разрешён.
Шебанг комментарий определяет путь к JavaScript интерпретатору, скрипт которого вы хотите выполнить. Пример, как это работает:
#!/usr/bin/env node
console.log("Hello world");
Примечание: Hashbang comments in JavaScript mimic shebangs in Unix used to run files with proper interpreter.
Предупреждение: Although BOM before hashbang comment will work in a browser it is not advised to use BOM in a script with hasbang. BOM will not work when you try to run the script in Unix/Linux. So use UTF-8 without BOM if you want to run scripts directly from shell.
Для определения JavaScript интерпретатора используйте только #! . В любых других случаях используйте // (или многострочный комментарий).
Ключевые слова
>Зарезервированные ключевые слова в ECMAScript 2015
Ключевые слова, зарезервированные на будущее
Следующие ключевые слова зарезервированы на будущее ECMAScript спецификацией. За ними сейчас не стоит никакой функциональности, но она может появиться в будущих версиях, поэтому эти ключевые слова не могут быть использованы, как идентификаторы. Эти ключевые слова не могут быть использованы даже в strict или non-strict режимах.
enumawait
Следующие ключевые слова зарезервированы для кода, который выполняется в strict режиме:
implementspackageprotectedstaticinterfaceprivatepublic
Зарезервированные ключевые слова в более старых версиях
Перечисленные ниже ключевые слова зарезервированы для старых версий ECMAScript спецификаций (ECMAScript от 1 по 3).
abstractbooleanbytechardoublefinalfloatgotointlongnativeshortsynchronizedtransientvolatile
К тому же, литералы null, true, и false зарезервированы в ECMAScript для их обычной функциональности.
Использование зарезервированных слов
Зарезервированные слова действительно применяются только к идентификаторам (vs. IdentifierNames). Как описано в es5.github.com/#A.1, это все имена IdentifierNames, которые не исключают зарезервированных слов.
a.import
a["import"]
a = { import: "test" }.
С другой стороны, следующее выражение неправильно, т.к. Идентификатор IdentifierName не содержит зарезервированных слов. Идентификаторы используются для FunctionDeclaration, FunctionExpression, VariableDeclaration и т.п., в то время, как IdentifierNames используются для MemberExpression, CallExpression и т.п.
function import() {} // неправильно.
Литералы
>Литерал Null
Подробнее о .nullnull