Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Lexical grammar

Эта статья нуждается в редакционном обзоре. Как вы можете помочь.

Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.

Этот раздел описывает синтаксис JavaScript. Исходный код ECMAScript скриптов сканируется слева направо и преобразуется в последовательность найденных элементов в токены, управляющие символы, окончания строк, комментарии или пробелы.
ECMAScript также определяет ключевые слова и литералы и имеет указания для автоматической вставки точек с запятой к концу инструкции.

 

Спецсимволы

Спецсимволы не имеют визуального представления, однако используются для управления интерпритацией текста.

Юникодные форматирующие спецсимволы
Code point Name Abbreviation Description
U+200C Zero width non-joiner <ZWNJ> Placed between characters to prevent being connected into ligatures in certain languages (Wikipedia).
U+200D Zero width joiner <ZWJ> Placed between characters that would not normally be connected in order to cause the characters to be rendered using their connected form in certain languages (Wikipedia).
U+FEFF Byte order mark <BOM> Used at the start of the script to mark it as Unicode and the text's byte order (Wikipedia).

Пробелы

Пробельные символы улучшают читабельность исходного текста и разделяет токены друг от друга. Пробельные символы обычно не обязательны для функционирования кода. Утилиты для уменьшения объема кода часто удаляют пробельные символы, чтобы уменьшить объем кода.

Таблица пробельных символов
Code point Name Abbreviation Description Escape sequence
U+0009 Character tabulation <HT> Horizontal tabulation \t
U+000B Line tabulation <VT> Vertical tabulation \v
U+000C Form feed <FF> Page breaking control character (Wikipedia). \f
U+0020 Space <SP> Normal space  
U+00A0 No-break space <NBSP> Normal space, but no point at which a line may break  
Others Other Unicode space characters <USP> Spaces in Unicode on Wikipedia  

Окончание строк

В дополнение к пробельным символам, символы окончания строк тоже используются для читабельности исходного кода. Однако, в некоторых случаях, символы окончания строк могут влиять на выполнение JavaScript кода, т.к. есть некоторые места, где они запрещены. 

Окончания строк также затрагивают процесс автоматического проставления точки с запятой. Также окончания строк попадают под условия регулярных выражений при поиске \s класса.

В ECMAScript, в качестве окончания строк можно использовать только ниже перечисленные Юникод символы. Другие символы окончания строк будут интерпретированы, как пробельные символы (например, Next Line, NEL, U+0085 будут интерпретироваться, как пробельные символы).

Символы окончания строк
Code point Name Abbreviation Description Escape sequence
U+000A Line Feed <LF> Новая строка в UNIX системах. \n
U+000D Carriage Return <CR> Новая строка в Commodore и ранних Mac systems. \r
U+2028 Line Separator <LS> Wikipedia  
U+2029 Paragraph Separator <PS> Wikipedia  

Комментарии

Комментарии используются для добавления подсказок, заметок, предложений или предупреждений. Они могут упростить чтение и понимание кода. Также они могут быть использованы для предотвращения выполнения кода (этот приём практикуется при отладке кода).

В JavaScript есть несколько способов указать комментарии в коде.

Первый способ // комментарий; в этом случае весь текст в строке после двойного слэша будет комментарием, например:

function comment() {
  // Это комментарий в строке
  console.log("Hello world!");
}
comment();

Второй способ - это /* */, такой способ более гибок, чем первый.

Например, вы можете использовать его в одной строке:

function comment() {
  /* Это однострочный комментарий */
  console.log("Hello world!");
}
comment();

Либо вы можете сделать многострочный комментарий, как показано здесь:

function comment() {
  /* This comment spans multiple lines. Notice
     that we don't need to end the comment until we're done. */
  console.log("Hello world!");
}
comment();

Также, если пожелаете, то вы можете использовать такое комментирование посреди строки кода. Хотя это может ухудшить читабельность кода:

function comment(x) {
  console.log("Hello " + x /* insert the value of x */ + " !");
}
comment("world");

Чтобы отключить выполнение кода, просто оберните код в комментарий, как здесь:

function comment() {
  /* console.log("Hello world!"); */
}
comment();

В этом случае console.log() никогда не выполнится, пока он внутри комментария. Таким способом можно отключить любое количество строк кода.

Ключевые слова

Зарезервированные ключевые слова в ECMAScript 6

 

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

Следующие ключевые слова зарезервированы на будущее 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

В тому же, литералы null, true, и false зарезервированы в ECMAScript для их обычной функциональности.

 

Использование зарезервированных слов

Reserved words actually only apply to Identifiers (vs. IdentifierNames) . As described in es5.github.com/#A.1, these are all IdentifierNames which do not exclude ReservedWords.

a.import
a["import"]
a = { import: "test" }.

On the other hand the following is illegal because it's an Identifier, which is an IdentifierName without the reserved words. Identifiers are used for FunctionDeclaration and FunctionExpression.

function import() {} // Illegal.

Литералы

Литерал Null

Подробнее о null.

null

Литерал Boolean

Подробнее о Boolean.

true
false

Литералы чисел

Decimal (десятичные числа)

1234567890
42

// Будьте осторожны с использованием нуля вначале числа:

0888 // 888 распознается, как десятичное число
0777 // распознается, как восьмиричное число, 511 - как десятичное число

Имейте в виду, что литералы десятичных чисел могут начинаться с нуля (0), за которым следует другое десятичное число, но в случае, если число начинается с нуля и за ним идет цифра меньше 8, то число будет распознано как восьмиричное.  This won't throw in JavaScript, see баг 957513. See also the page about parseInt().

Binary (двоичные числа)

Синтаксис двоичных чисел состоит из цифры ноль, за которой следует маленькая или большая латинская буква "B" (0b или 0B). Этот синтаксис новый и появился только в ECMAScript 6, пожалуйста посмотрите таблицу совместимости с браузерами. This will throw a SyntaxError: "Missing binary digits after 0b", if digits are not 0 or 1.

var FLT_SIGNBIT  = 0b10000000000000000000000000000000; // 2147483648
var FLT_EXPONENT = 0b01111111100000000000000000000000; // 2139095040
var FLT_MANTISSA = 0B00000000011111111111111111111111; // 8388607

Octal

Octal number syntax using a leading zero followed by a lowercase or uppercase Latin letter "O" (0o or 0O). This syntax is new in ECMAScript 6, please see the browser compatibility table. This will throw a SyntaxError: "Missing octal digits after 0o", if digits are not between 0 and 7.

var n = 0O755; // 493
var m = 0o644; // 420

// Also possible with leading zeros (see note about decimals above)
0755
0644

Hexadecimal

Hexadecimal number syntax using a leading zero followed by a lowercase or uppercase Latin letter "X" (0x or 0X). This will throw a SyntaxError: "Identifier starts immediately after numeric literal", if it is outside the hexadecimal range (0123456789ABCDEF).

0xFFFFFFFFFFFFFFFFF // 295147905179352830000
0x123456789ABCDEF   // 81985529216486900
0XA                 // 10

Литерал Object

See also Object and Object initializer for more information.

var o = { a: "foo", b: "bar", c: 42 };

// сокращенная нотация. Появилась в ES6
var a = "foo", b = "bar", c = 42;
var o = {a, b, c};
// вместо
var o = { a: a, b: b, c: c };

Литерал Array

See also Array for more information.

[1954, 1974, 1990, 2014]

Литерал String (строка)

'foo'
"bar"

Экранирование шеснядцатиричной последовательности

'\xA9' // "©"

Экранирование Юникод символов

Для экранирования Юникод символов обязательно нужно указать по-крайней мере 4 символа после \u.

'\u00A9' // "©"

Unicode code point escapes

New in ECMAScript 6. With Unicode code point escapes, any character can be escaped using hexadecimal numbers so that it is possible to use Unicode code points up to 0x10FFFF. With simple Unicode escapes it is often necessary to write the surrogate halves separately to achieve the same.

See also String.fromCodePoint() or String.prototype.codePointAt().

'\u{2F804}'

// the same with simple Unicode escapes
'\uD87E\uDC04'

Литерал Регулярного выражения

See also RegExp for more information.

/ab+c/g

// An "empty" regular expression literal
// The empty non-capturing group is necessary 
// to avoid ambiguity with single-line comments.
/(?:)/

Литерал Шаблона

See also template strings for more information.

`string text`

`string text line 1
 string text line 2`

`string text ${expression} string text`

tag `string text ${expression} string text`

Автоматическая вставка "точки с запятой"

Некоторые JavaScript условия должны быть завершены точкой с запятой и поэтому на них влияет автоматическая вставка точки с запятой (ASI):

  • Пустое условие
  • let, const, переменные
  • import, export, объявление модулей
  • Оператор-выражение
  • debugger
  • continue, break, throw
  • return

Спецификация ECMAScript напоминает о трех правилах вставки точки с запятой.

1.  A semicolon is inserted before, when a Line terminator or "}" is encountered that is not allowed by the grammar.

{ 1 2 } 3 // следуя ASI будет преобразовано в { 1 2 ;} 3;

2.  A semicolon is inserted at the end, when the end of the input stream of tokens is detected and the the parser is unable to parse the single input stream as a complete program.

Here ++ is not treated as a postfix operator applying to variable b, because a line terminator occurs between b and ++.

a = b
++c

// is transformend by ASI into

a = b;
++c;

3. A semicolon is inserted at the end, when a statement with restricted productions in the grammar is followed by a line terminator. These statements with "no LineTerminator here" rules are:

  • PostfixExpressions (++ and --)
  • continue
  • break
  • return
  • yield, yield*
  • module
return
a + b

// is transformed by ASI into

return;
a + b;

Specifications

Specification Status Comment
ECMAScript 1st Edition. Standard Initial definition.
ECMAScript 5.1 (ECMA-262)
Определение 'Lexical Conventions' в этой спецификации.
Стандарт  
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Lexical Grammar' в этой спецификации.
Стандарт Added: Binary and Octal Numeric literals, Unicode code point escapes, Templates

Совместимость с браузерами

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support (Да) (Да) (Да) (Да) (Да)
Binary and octal numeric literals
(0b and 0o)
(Да) 25 (25) ? ? ?
Unicode code point escapes
(\u{})
? Нет
баг 320500
? ? ?
Shorthand notation for object literals Нет 33 (33) Нет Нет Нет
Template literals Нет 34 (34) Нет Нет Нет
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Да) (Да) (Да) (Да) (Да) (Да)
Binary and octal numeric literals ? ? 33.0 (33) ? ? ?
Unicode code point escapes ? ? Нет
баг 320500
? ? ?
Shorthand notation for object literals Нет Нет 33.0 (33) Нет Нет Нет
Template literals Нет Нет 34.0 (34) Нет Нет Нет

Firefox-specific notes

  • Prior to Firefox 5 (JavaScript 1.8.6), future reserved keywords could be used when not in strict mode. This ECMAScript violation was fixed in Firefox 5.

See also

Метки документа и участники

 Внесли вклад в эту страницу: pk.prog, Frenk1, MichaelBag, gremlinLee
 Обновлялась последний раз: pk.prog,