Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

Эта страница была переведена с английского языка силами сообщества. Вы тоже можете внести свой вклад, присоединившись к русскоязычному сообществу MDN Web Docs.

Грамматика и типы

В данной главе рассматриваются базовая грамматика, объявление переменных, типы данных и литералы.

Основы

JavaScript заимствует большую часть синтаксиса из Java, но также испытал влияние таких языков, как Awk, Perl и Python.

JavaScriptчувствителен к регистру и использует кодировку символовUnicode. Например, слово Früh ("рано" по-немецки) может использоваться в качестве имени переменной.

js
var Früh = "foobar";

Но, переменнаяfrüh не то же самое чтоFrüh потому что JavaScript чувствителен к регистру.

В JavaScript инструкции называютсяstatements и разделяются точкой с запятой (;). Пробел (space), табуляция (tab) и перевод строки (newline) называются пробельными символами (whitespace). Исходный текст скриптов на JavaScript сканируется слева направо и конвертируется в последовательность входных элементов, являющихся токенами (tokens), управляющими символами, символами конца строки, комментариями или пробельными символами. ECMAScript также определяет некоторые ключевые слова и литералы и устанавливает правила для автоматической вставки точек с запятой (ASI), чтобы обозначить конец инструкций (statements). Однако, рекомендуется всегда ставить точку с запятой в конце каждой инструкции вручную, чтобы избежать побочных эффектов. Чтобы получить более подробную информацию, прочитайтеLexical Grammar.

Комментарии

Синтаксискомментариев является таким же, как и в C++ и во многих других языках:

js
// Комментарий, занимающий одну строку./* Комментарий,   занимающий несколько строк. *//* Нельзя вкладывать /* комментарий в комментарий */ SyntaxError */

Объявления

В JavaScript существует три вида объявлений:

var

Объявляет переменную, инициализация переменной значением является необязательной.

let

Объявляет локальную переменную в области видимости блока, инициализация переменной значением является необязательной.

const

Объявляет именованную константу, доступную только для чтения.

Переменные

Вы можете использовать переменные как символические имена для значений в вашем приложении. Имена переменных называютсяidentifiers и должны соответствовать определённым правилам.

Идентификатор в JavaScript должен начинаться с буквы, нижнего подчёркивания (_) или знака доллара ($); последующие символы могут также быть цифрами (0-9). Поскольку JavaScript чувствителен к регистру, буквы включают символы от "A" до "Z" (верхний регистр) и символы от "a" до "z" (нижний регистр).

Вы можете использовать в идентификаторах буквы ISO 8859-1 или Unicode, например, å или ü. Вы также можете использоватьуправляющие последовательности Unicode как символы в идентификаторах.

Некоторые примеры корректных имён:Number_hits,temp99,_name.

Объявление переменных

Вы можете объявить переменную тремя способами:

  • Используя ключевое словоvar. Например,var x = 42. Данный синтаксис может быть использован для объявления как локальных, так и глобальных переменных.
  • Просто присвоить переменной значение. Например,x = 42. Переменные, объявленные данным способом, являются глобальными. Такое объявление генерируетстрогое предупреждение (strict mode). Не рекомендуется использовать данный способ.
  • Используя ключевое словоlet. Например,let y = 13. Данный синтаксис может быть использован для объявления локальной переменной в области видимости блока.

Присваивание значений

Переменная, объявленная черезvar илиlet без присвоения начального значения, имеет значениеundefined.

При попытке доступа к необъявленной переменной или переменной до её объявления будет выброшено исключениеReferenceError:

js
var a;console.log("The value of a is " + a); //Значение переменной a undefinedconsole.log("The value of b is " + b); //Uncaught ReferenceError: b не определенаconsole.log("The value of c is " + c); //Значение переменной c undefinedvar c;console.log("The value of x is " + x); //Uncaught ReferenceError: x не определенаlet x;

Вы можете использоватьundefined, чтобы определить, имеет ли переменная значение. В следующем примере переменнойinput не присвоено значение, и операторif будет вычислен какtrue:

js
var input;if (input === undefined) {  doThis();} else {  doThat();}

Значениеundefined ведёт себя какfalse, когда используется в логическом контексте. Например, следующий код выполняет функциюmyFunction, т.к. элементmyArray не определён:

js
var myArray = [];if (!myArray[0]) {  myFunction();}

Значениеundefined конвертируется вNaN, когда используется в числовом контексте:

js
var a;a + 2; // NaN

Значениеnull ведёт себя как 0 в числовом контексте и какfalse в логическом контексте:

js
var n = null;console.log(n * 32); // В консоль выведется 0

Область видимости переменных

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

До ECMAScript 6 в JavaScript отсутствовала область видимостиблока; переменная, объявленная внутри блока, является локальной для _функции _(илиглобальной области видимости), внутри которой находится данный блок. Например, следующий код выведет значение 5, т.к. областью видимости переменнойx является функция (или глобальный контекст), внутри которой объявлена переменнаяx, ане блок, которым в данном случае является операторif:

js
if (true) {  var x = 5;}console.log(x); // 5

Такое поведение меняется, если используется операторlet, введённый в ECMAScript 6:

js
if (true) {  let y = 5;}console.log(y); // ReferenceError

Поднятие переменных

Другим необычным свойством переменных в JavaScript является то, что можно сослаться на переменную, которая объявляется позже, и не получить при этом исключения. Эта концепция известна какподнятие (hoisting) переменных; переменные в JavaScript поднимаются в самое начало функции или выражения. Однако, переменные, которые ещё не были инициализированы, возвратят значениеundefined:

js
/* * Example 1 */console.log(x === undefined); // truevar x = 3;/* * Example 2 */var myvar = "my value";(function () {  console.log(myvar); // undefined  var myvar = "local value";})();

Приведённые выше примеры будут интерпретироваться так же, как:

js
/* * Example 1 */var x;console.log(x === undefined); // truex = 3;/* * Example 2 */var myvar = "my value";(function () {  var myvar;  console.log(myvar); // undefined  myvar = "local value";})();

Из-за поднятия переменных, все операторыvar в функции следует размещать настолько близко к началу функции, насколько это возможно. Следование этому правилу улучшает ясность кода.

В ECMAScript 2015,let (const)не будет подниматься вверх блока. Однако, ссылки на переменную в блоке до объявления переменной вызовутReferenceError. Переменная во "временной мёртвой зоне" в начале блока, до объявления.

js
function do_something() {  console.log(foo); // ReferenceError  let foo = 2;}

Поднятие функций

Для функций: только определения функций поднимаются наверх, но не функции, определённые через выражения.

js
/* Определение функции */foo(); // "bar"function foo() {  console.log("bar");}/* Определение функции через выражение */baz(); // TypeError: baz is not a functionvar baz = function () {  console.log("bar2");};

Глобальные переменные

Глобальные переменные на самом деле являются свойствамиглобального объекта. На веб-страницах глобальным объектом являетсяwindow, поэтому вы можете устанавливать глобальные переменные и обращаться к ним, используя синтаксисwindow.variable:

js
window.foo = "bar";

Следовательно, вы можете обращаться к глобальным переменным, объявленным в одном объекте window или frame из другого объекта window или frame, указав имя window или frame. Например, если переменнаяphoneNumber объявлена в документе, то вы можете сослаться на эту переменную из iframe какparent.phoneNumber.

Константы

Вы можете создать именованную константу, доступную только для чтения, используя ключевое словоconst. Синтаксис идентификатора константы является таким же, как и у идентификатора переменной: он должен начинаться с буквы, нижнего подчёркивания или знака $ и может содержать буквы, цифры или нижнее подчёркивание.

js
const PREFIX = "212";

Нельзя изменить значение константы через присваивание или повторное объявление во время выполнения скрипта. Значение должно быть указано при инициализации.

Правила, касающиеся области видимости, для констант являются такими же, как и для переменных, объявленных черезlet. Если ключевое словоconst не указано, то идентификатор будет являться переменной.

Нельзя объявить константу с таким же именем, как у функции или переменной в одной области видимости. Следующие примеры выбросят исключениеTypeError:

js
// Это вызовет ошибкуfunction f() {}const f = 5;// Это тоже вызовет ошибкуfunction f() {  const g = 5;  var g;  // какие-то выражения}

Однако, атрибуты объектов не защищены, так что следующее выражение выполнится без проблем

js
const MY_OBJECT = { key: "value" };MY_OBJECT.key = "otherValue";

Структуры и типы данных

Типы данных

Последний стандарт ECMAScript определяет семь типов данных:

  • Шесть типов данных, которые являютсяпримитивами:

    • Boolean.true иfalse.
    • null. Специальное ключевое слово, обозначающее нулевое или «пустое» значение. Поскольку JavaScript чувствителен к регистру,null не то же самое, чтоNull,NULL или любой другой вариант.
    • undefined. Свойство глобального объекта; переменная, не имеющая присвоенного значения, обладает типомundefined.
    • Number.42 или3.14159.
    • String. "Howdy".
    • Symbol (ECMAScript 6)
  • иObject

Хотя типов данных относительно немного, но они позволяют вам выполнять полезные функции в ваших приложениях.Объекты ифункции являются другими фундаментальными элементами языка. Вы можете думать об объектах как об именованных контейнерах для значений и о функциях как о процедурах, которые ваше приложение может исполнять.

Преобразование типов данных

JavaScript — это динамически типизированный язык. Это означает, что вам не нужно указывать тип данных переменной, когда вы её объявляете, типы данных преобразуются автоматически по мере необходимости во время выполнения скрипта. Так, например, вы можете определить переменную следующим образом:

js
var answer = 42;

А позже вы можете присвоить этой переменной строковое значение, например:

js
answer = "Thanks for all the fish...";

Поскольку JavaScript является динамически типизированным, это присваивание не вызовет сообщения об ошибке.

В выражениях, включающих числовые и строковые значения с оператором+, JavaScript преобразует числовые значения в строковые. Например:

js
x = "The answer is " + 42; // "The answer is 42"y = 42 + " is the answer"; // "42 is the answer"

В выражениях с другими операторами JavaScript не преобразует числовые значения в строковые. Например:

js
"37" - 7; // 30"37" + 7; // "377"

Преобразование строк в числа

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

parseInt преобразует строку в целочисленное значение. Хорошей практикой является всегда указывать основание системы счисления (параметрradix).

Альтернативным способом для получения числа из строки является использование оператора "унарный плюс":

js
"1.1" + "1.1"; // "1.11.1"(+"1.1") + (+"1.1"); // 2.2// Обратите внимание на то, что скобки не являются обязательными и используются для ясности.

Литералы

Литералы используются для представления значений в JavaScript. Они являются фиксированными значениями, а не переменными. В данной секции рассматриваются следующие типы литералов:

Литерал массива

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

В следующем примере создаётся массивcoffees с тремя элементам и длиной, равной трём:

js
var coffees = ["French Roast", "Colombian", "Kona"];

Примечание:Обратите внимание на то, что литерал массива является инициализатором объекта. Чтобы получить более подробную информацию, прочитайтеИспользование инициализаторов объекта.

Если массив создаётся с помощью литерала в скрипте верхнего уровня, то JavaScript интерпретирует массив каждый раз, когда вычисляет выражение, содержащее литерал. Кроме того, литерал, используемый в функции, создаётся каждый раз, когда вызывается функция.

Литералы массива также являются объектамиArray. Чтобы получить более подробную информацию, прочитайтеArray иупорядоченные наборы данных.

Лишние запятые в литералах array

Не обязательно указывать все элементы в литерале array. Если вы поставите две запятые подряд, то пропущенные элементы будут иметь значениеundefined. Например:

js
var fish = ["Lion", , "Angel"]; // ["Lion", undefined, "Angel"]

У этого массива есть 2 элемента со значениям и один пустой (fish[0] - "Lion",fish[1] -undefined, аfish[2] - "Angel").

Если вы поставите запятую в конце списка элементов, то она будет проигнорирована. В следующем примере, длина массива равна 3. НетmyList[3]. Все другие запятые в списке говорят о новом элементе.

Примечание:Лишние запятые могут вызывать ошибки в старых версиях браузеров, поэтому лучше избегать их использования.

js
var myList = ["home", , "school", ]; // ["home", undefined, "school"]

В следующем примере длина массива равна четырём, элементыmyList[0] иmyList[2] имеют значениеundefined:

js
var myList = [, "home", , "school"]; // [undefined, "home", undefined, "school"]

В следующем примере длина массива равна четырём, элементыmyList[1] иmyList[3] имеют значениеundefined. Игнорируется только последняя запятая.

js
var myList = ["home", , "school", ,]; // ["home", undefined, "school", undefined]

Понимание поведения лишних запятых важно для понимания JavaScript как языка. Однако, когда будете писать свой собственный код, то имейте в виду, что явное объявление отсутствующих элементов какundefined улучшает ясность кода и лёгкость его поддержки.

Логические литералы

Логический (Boolean) тип имеет два литеральных значения:true иfalse.

Не путайте примитивные логические значенияtrue иfalse со значениями true и false объекта Boolean. Объект Boolean является объектом-обёрткой над примитивом логического типа. Чтобы получить более подробную информацию, прочитайтеBoolean.

Литерал целого числа

Целые числа могут быть записаны в десятичной, шестнадцатеричной, восьмеричной и двоичной системах счисления.

  • Десятичный целочисленный литерал состоит из последовательности цифр без ведущего нуля.
  • Ведущий ноль в целочисленном литерале указывает на то, что он записан в восьмеричной системе счисления. Восьмеричные целые числа состоят только из цифр 0-7.
  • Ведущие символы 0x (или 0X) указывают на то, что число шестнадцатеричное. Шестнадцатеричные целые числа могут состоять из цифр 0-9 и букв a-f и A-F.
  • Ведущие символы 0b (или 0B) указывают на то, что число двоичное. Двоичные числа могут включать в себя только цифры 0 и 1.

Несколько примеров целочисленных литералов:

0, 117 и -345 (десятичная система счисления)015, 0001 и -077 (восьмеричная система счисления)0x1123, 0x00111 и -0xF1A7 (шестнадцатеричная система счисления)0b11, 0b0011 и -0b11 (двоичная система счисления)

Для дополнительной информации смотритечисловые литералы в лексической грамматике.

Литерал числа с плавающей точкой

Числа с плавающей точкой могут состоять из следующих частей:

  • Десятичное целое число, которое может иметь знак (символ "+" или "-", стоящий перед числом),
  • Десятичная точка ("."),
  • Дробная часть (другое десятичное число),
  • Экспонента.

Экспонента состоит из символа "e" или "E", за которым следует целое число, которое может иметь знак. Число с плавающей точкой должно состоять по крайней мере из одной цифры и либо десятичной точки, либо символа "e" (или "E").

В более сжатой форме синтаксис выглядит следующим образом:

[(+|-)][digits][.digits][(E|e)[(+|-)]digits]

Примеры:

3.14-3.1E+12-.3333333333333333333.1e-23

Литерал объекта

Литерал объекта — это список из нуля или более пар, состоящих из имён свойств и связанных с ними значений, заключённый в фигурные скобки ({} ). Вам не следует использовать литерал объекта в начале выражения, т.к. это приведёт к ошибке или к поведению, которого вы не ожидаете, потому что символ "{" будет интерпретироваться как начало блока.

В следующем примере свойствуmyCar объектаcar присваивается строка"Saturn", свойствуgetCar — результат вызова функцииCarTypes("Honda"), свойствуspecial — значение переменнойSales:

js
var Sales = "Toyota";function CarTypes(name) {  if (name == "Honda") {    return name;  } else {    return "Извините, мы не продаём " + name + ".";  }}var car = { myCar: "Saturn", getCar: CarTypes("Honda"), special: Sales };console.log(car.myCar); // Saturnconsole.log(car.getCar); // Hondaconsole.log(car.special); // Toyota

Кроме того, вы можете использовать числовой или строковой литералы в именах свойств или вкладывать один объект в другой. Например:

js
var car = { manyCars: { a: "Saab", b: "Jeep" }, 7: "Mazda" };console.log(car.manyCars.b); // Jeepconsole.log(car[7]); // Mazda

Именем свойства объекта может быть любая строка, в том числе пустая строка. Если имя свойства не является корректным JavaScript идентификатором, то оно должно быть заключено в кавычки. Для обращения к таким именам следует использовать квадратные скобки ([] ), а не точку (. ):

js
var unusualPropertyNames = {  "": "An empty string",  "!": "Bang!"}console.log(unusualPropertyNames."");   // SyntaxError: Unexpected stringconsole.log(unusualPropertyNames[""]);  // "An empty string"console.log(unusualPropertyNames.!);    // SyntaxError: Unexpected token !console.log(unusualPropertyNames["!"]); // "Bang!"

В ES2015 литералы объектов расширены до поддержки установки прототипа в конструкции короткой записи дляfoo: заданиеfoo, определение методов, создание супер вызовов и вычисление имён свойств в выражениях. Вместе, они делают похожими объектные литералы и объявления классов, а также позволяют объектному дизайну получать выгоду одинаковых возможностей.

js
var obj = {  // __proto__  __proto__: theProtoObj,  // Короткая запись для ‘handler: handler’  handler,  // Методы  toString() {    // Супер вызовы    return "d " + super.toString();  },  // Динамическое вычисление имён свойств  ["prop_" + (() => 42)()]: 42,};

Обратите внимание на следующий пример:

js
var foo = { a: "alpha", 2: "two" };console.log(foo.a); // alphaconsole.log(foo[2]); // two// console.log(foo.2);            // SyntaxError: Unexpected number// console.log(foo[a]);           // ReferenceError: a is not definedconsole.log(foo["a"]); // alphaconsole.log(foo["2"]); // two

RegExp литерал

Литерал regexp - шаблон между слешами. Следующий пример литерал regex:

js
var re = /ab+c/;

Строковый литерал

Строковый литерал — это ноль или более символов, заключённых в двойные (" ) или одинарные (' ) кавычки. Строка должна быть ограничена кавычками одного типа, т.е. либо обе одинарные, либо обе двойные. Например:

"foo"'bar'"1234""one line \n another line""John's cat"

Вы можете вызвать любой из методов объектаString для строкового литерала: JavaScript автоматически преобразует строковой литерал во временный объектString, вызовет метод, а затем уничтожит временный объектString. Вы также можете использовать свойствоString.length со строковым литералом:

js
console.log("John's cat".length);// Число символов в строке, включая пробел.// В данном случае длина строки равна 10.

В ES2015 также доступны шаблоны строк. Шаблоны строк представляют собой синтаксический сахар для конструирования строк. Это похоже на возможности интерполяции строк в Perl, Python и других. Дополнительно, может быть добавлен тег, позволяющий настраивать конструирование строк, избегая атак внедрения и построения структур данных высокого уровня из содержимого строки.

js
// Простое создание строки через литерал string`In JavaScript '\n' is a line-feed.`;// Мультистроковые строки`In JavaScript this is not legal.`;// Интерполяция строкvar name = "Бобби",  time = "сегодня";`Привет ${name}, как ты ${time}?`;// Строим префикс HTTP запроса, используемый для интерпретации замен и конструированияPOST`http://foo.org/bar?a=${a}&b=${b}     Content-Type: application/json     X-Credentials: ${credentials}     { "foo": ${foo},       "bar": ${bar}}`(myOnReadyStateChangeHandler);

Вам следует использовать строковые литералы до тех пор, пока вам специально не понадобится объектString. Чтобы получить более подробную информацию об объектеString, прочитайтеString.

Использование специальных символов в строках

Кроме обычных символов вы также можете включать специальные символы в строки.

js
"one line \n another line";

В следующей таблице перечислены специальные символы, которые вы можете использовать.

СимволЗначение
\bВозврат (Backspace)
\fПеревод или прогон страницы (Form feed)
\nПеревод строки (New line)
\rВозврат каретки (Carriage return)
\tТабуляция (Tab)
\vВертикальная табуляция (Vertical tab)
\'Апостроф или одинарная кавычка
\"Двойная кавычка
\\Обратная косая черта (Backslash)
\XXXСимвол в кодировке Latin-1, представленный тремя восьмеричными числамиXXX от 0 до 377. Например, \251 (символ ©).
\xXXСимвол в кодировке Latin-1, представленный двумя шестнадцатеричными числамиXX от 00 до FF. Например, \xA9 (символ ©).
\uXXXXСимвол в Unicode, представленный четырьмя шестнадцатеричными числамиXXXX. Например, \u00A9 (символ ©).
\u{XXXXX}Символ в UTF-32BE. Например, \u{2F804} обозначает то же, что обычная запись \uD87E\uDC04.

Экранирующие символы

Для символов, не перечисленных в вышеприведённой таблице, предваряющая обратная косая черта игнорируется. Такое использование не является рекомендованным (deprecated) и вам следует избегать его.

Вы можете вставить кавычку в строку, если поставите перед ней обратную косую черту. Это называется экранированием кавычек. Например:

js
var quote = "He read \"The Cremation of Sam McGee\" by R.W. Service.";console.log(quote); // He read "The Cremation of Sam McGee" by R.W. Service.

Чтобы включить обратную косую черту в строку, перед ней нужно поставить ещё одну обратную косую черту. Например:

js
var home = "c:\\temp"; // c:\temp

Вы также можете экранировать перевод строки. Обратная косая черта и перевод строки будут удалены из содержимого строки. Например:

js
var str =  "this string \is broken \across multiple\lines.";console.log(str); // this string is broken across multiplelines.

Хотя JavaScript не поддерживает синтаксис "heredoc" (форматированный текст в одной строковой переменной), но вы можете эмулировать его, добавив перевод строки и обратную косую черту в конец каждой строки:

js
var poem =  "Roses are red,\n\Violets are blue.\n\I'm schizophrenic,\n\And so am I.";

Дополнительная информация

Данная глава сфокусирована на базовом синтаксисе для объявлений и типов. Чтобы получить более подробную информацию о конструкциях JavaScript, прочитайте:

В следующей главе рассматриваются управляющие конструкции и обработка ошибок.

Help improve MDN

Learn how to contribute.

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp