ECMAScript

Материал из Википедии — свободной энциклопедии
Перейти к навигацииПерейти к поиску
ECMAScript
Класс языкаСпецификация языков программирования и товарный знак
Появился виюнь1997
АвторБрендан Эйх и Ecma International
РазработчикБрендан Эйх
Расширение файлов.es[2]
ВыпускECMAScript 2024[Спецификация 1] (июнь 2024; 1 год назад (2024-06))
Система типовутиная
ДиалектыJavaScript,JScript,ActionScript,JScript .NET,QtScript
Испытал влияниеSelf[1],Си,Scheme[1],Perl[1],Python,Java[1],AWK[1]
Повлиял наObjective-J
Сайтecma-international.org (англ.)

ECMAScript — встраиваемый расширяемый не имеющий средствввода-выводаязык программирования, используемый в качестве основы для построения другихскриптовых языков[3].

ECMAScriptстандартизированмеждународной организациейECMA вспецификацииECMA-262. Расширения языка:JavaScript,JScript иActionScript.

Содержание

История

[править |править код]

Язык возник на основе нескольких технологий, самыми известными из которых являются языкиJavaScript иJScript. Разработка первой редакции спецификации началась в ноябре 1996 года. Принятие спецификации состоялось в июне 1997 года. Будучи отправленной в ISO/IEC JTC 1 для принятия по процедуреFast-Tracking, она послужила основой международного стандартаISO/IEC 16262. В июне 1998 года общим собранием ECMA была принята вторая редакция ECMA-262, соответствующая ISO/IEC 16262. Третья редакция спецификации отличалась от предыдущей введением поддержки регулярных выражений, улучшением поддержки строк, введением новых управляющих конструкций, механизма исключений, форматирования при численном вводе и некоторыми другими изменениями[Спецификация 2].

Семантика и синтаксис

[править |править код]

Типы данных

[править |править код]

В ECMAScript поддерживаются семьпримитивныхтипов данных:

Числовой тип данных в ECMAScript соответствует 64-битному формату чисел с плавающей запятой, определённому стандартомIEEE 754-2008 за исключением того, что различные значенияNot-a-Number, определяемые в стандарте[4], представляются в данном языке единственным специальным значениемNaN[Спецификация 4].

Нулевой и неопределённый типы данныхДэвидом Флэнаганом неформально причисляются к «тривиальным» типам, поскольку каждый из них определяет только одно значение[5].

Также в языке имеется «составной» тип данных[5]:

Помимо перечисленных восьми типов данных, в ECMAScript имеется поддержка[Спецификация 5] ещё ряда типов, используемых для хранения промежуточных результатов вычисляемых выражений.

Популярность языка JavaScript и нетривиальность обработки данных, относящихся к разным типам, обусловили развёртывание академических исследований в области анализа типов данных ECMAScript, ставящих своей целью создание полноценного анализатора кода, который можно было бы применять винтегрированных средах разработки[6].

Инструкции

[править |править код]

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

Типы инструкций, определяемые спецификацией языка[Спецификация 6]
НазваниеОригинальное названиеКраткие сведенияЗавершающая ;[Спецификация 7]
Блокангл. Block{[<инструкции>]}
Объявление переменнойангл. VariableStatementvar <список объявления переменных>+
Пустая инструкцияангл. EmptyStatement;+
Выражениеангл. ExpressionStatement[строка до ∉ {{, function}] инструкция+
Условиеангл. IfStatementif (<инструкция>) <выражение>[ else <выражение>]
Циклангл. IterationStatementdo <выражение> while (<инструкция>)

while (<инструкция>) <выражение>
for ([<инструкция до начала>]; [<инструкция>]; [<инструкция>]) <выражение>
for (<объявление переменных>; [<инструкция>]; [<инструкция>]) <выражение>
for (<lvalue-выражение> in <инструкция>) <выражение>
for (<объявление переменных> in <инструкция>) <выражение>

+/−[~ 1]
Продолжениеангл. ContinueStatementcontinue [<идентификатор>]+
Прерываниеангл. BreakStatementbreak [<идентификатор>]+
Возвратангл. ReturnStatementreturn [<инструкция>]+
Сочетаниеангл. WithStatementwith (<инструкция>) <выражение>
Меткаангл. LabelledStatement<идентификатор>: <выражение>
Выборангл. SwitchStatementswitch (<инструкция>) case <инструкция>: [<выражения>][ case <инструкция>: [<выражения>] …] [default: [<выражения>]]
Генерация исключенияангл. ThrowStatementthrow <инструкция>+
Блок tryангл. TryStatementtry <блок> catch (<идентификатор>) <блок>
try <блок> finally <блок>
try <блок> catch (<идентификатор>) <блок> finally <блок>
(новое[Спецификация 8]) Отладчикангл. Debuggerdebugger

Автодополнение строк точками с запятой

[править |править код]

Несмотря на обязательность точки с запятой в случаях, отмеченных в четвёртой колонке, спецификация декларируетмеханизм автодополнения строк точками с запятой, приводящий к тому, что при наличии переноса строки инструкция до переноса может быть снабжена этим знаком[Спецификация 7], что является объектом критики[7].

Инструкции, меняющие смысл при использовании перевода строки внутри[Спецификация 7]
[править |править код]
  • Унарный постфиксный ++
  • Унарный постфиксный --
  • Продолжение
  • Прерывание
  • Возврат
  • Генерация исключения

Пример изменения смысла инструкции

return{status:"complete"};

Здесь выделенная строка содержит допустимую языком инструкцию и, поскольку далее следует перевод строки, срабатывает механизм автодополнения строк точками с запятой. Вместо того, чтобы функция, содержащая приведённый код, в качестве своего значения вернула объект со свойствомstatus, она вернётundefined.

Несмотря на то, что литеральная форма записи объекта блоком кода не является, единообразие в расстановке скобок может приводить к ошибкам. Снизить вероятность их появления способна выработка или принятие подходящегостандарта оформления кода. Играет роль выборстиля отступов. В частности, стилиОлмана иУайтсмита, а такжестиль Хорстмана истиль GNU для кода JavaScript не рекомендуются к использованию большинством руководств[8] в отличие от стилейK&R, 1TBS, BSD KNF.

Несрабатывание механизма автодополнения
[править |править код]

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

func()['h1','h2'].forEach(function(t){handleTag(t)})

В данном примере квадратные скобки на второй строке интерпретируются в качестве обращения к элементу массива, возвращаемого func(). Запятая в скобках трактуется как соответствующий оператор, возвращающий 'h2'. Таким образом, код преобразуется к следующему:

func()['h2'].forEach(function(t){handleTag(t);});

В стандартах кодирования принято прописывать обязательность проставления точек с запятой даже в тех случаях, когда синтаксис языка позволяет их опускать[Стандарты кодирования 1][Стандарты кодирования 2][Стандарты кодирования 3][Стандарты кодирования 4][Стандарты кодирования 5].

Блоки и область видимости

[править |править код]

Ещё одной особенностью ECMAScript по отношению к другимC-подобным языкам является то, что в данном языке блоки не образуютобласти видимости. Объявленные в блоке переменные распространяются на всю функцию, содержащую блок[10][11].

В данном участке кода имеет место повторное объявление переменной в выделенных строках:

functionfoo(){varsum=0;for(vari=0;i<42;i+=2){vartmp=i+2;sum+=i*tmp;}for(vari=1;i<42;i+=2){sum+=i*i;}alert(tmp);returnsum;}foo();

Кроме того, к переменнойtmp, объявленной внутри первого из циклов (строка 4), в соответствии с синтаксисом языка вполне законно обратиться извне цикла (строка 10).

Из-за особенностей, связанных с областью видимости и блоками, в целях поддержаниякачества исходного кода рекомендуется объявлять переменные в начале функций[10][Стандарты кодирования 1][Стандарты кодирования 4].

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

[править |править код]

Переменные определяются с помощью ключевых словvar, let, const. При объявлении переменная помещается в область видимости, соответствующую в случаеvar функции, а в случаеlet, const блоку кода. Если переменная объявляется вне функций, она помещается в глобальную область видимости. Создание переменной происходит при получении управления функцией с её объявлением. Или программой, если переменная глобальна. При создании переменной в ECMAScript она приобретает значениеundefined. Если переменная объявлена синициализацией, инициализация происходит не в момент создания переменной, а при выполнении строки с инструкциейvar[Спецификация 9].

При раскомментировании выделенной строки на экран будет выводиться неnumber, аundefined:

vara=42;functionfoo(){alert(typeofa);// var a = 10;}foo();

При создании переменной она приобретает внутреннее свойство {DontDelete} и её невозможно удалить с помощью оператораdelete[Спецификация 9]. Исключение составляют переменные, объявленные в контекстеeval[12][Спецификация 10].

Многие источники[13][14][15][16][17][18] декларируют возможность неявного объявления переменных в ECMAScript при осуществлении присваивания корректному идентификатору, не являющемуся формальным аргументом функции, без предварительного объявления с помощьюvar. Однако в терминологии спецификации языка в этом случае создаётся свойство глобального объекта, а не переменная[12][Спецификация 9].

Фиксация в стандарте оформления кода необходимости обязательного объявления переменных до их использования[Стандарты кодирования 1][Стандарты кодирования 4] (либо фиксация необходимости использоватьпространства имён для всех глобальных объектов[Стандарты кодирования 2]) позволяет избегать трудноуловимых ошибок, предотвращая опасность взаимодействия одинаково названных переменных в разных участках кода[19].

Ключевые и зарезервированные слова

[править |править код]

Следующие слова являются ключевыми в языке и не могут быть использованы как идентификаторы[Спецификация 11]:

 break    do       instanceof typeof case     else     new        var catch    finally  return     void continue for      switch     while debugger function this       with default  if       throw delete   in       try

По сравнению с третьей редакцией спецификации[Спецификация 12] в пятой добавилось ключевое словоdebugger с соответствующей инструкцией.

Следующие слова используются как ключевые слова в предложенных расширениях и поэтому являются зарезервированными для возможности адаптировать эти расширения[Спецификация 13]:

 class enum   extends super const export import

При использовании строгого режима следующие слова рассматриваются как зарезервированные для использования в будущем[Спецификация 13]:

 implements let     private   public yield interface  package protected static

Таким образом, по сравнению с третьей редакцией спецификации языка количество зарезервированных для использования в будущем слов существенно снизилось. Ранее их было 31[Спецификация 14], и наличие большого количества ключевых и зарезервированных слов, большинство из которых не используется в языке, подвергалось критике[20].

Операторы

[править |править код]

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

Классификация операторов

[править |править код]

По убываниюприоритета операторы ECMAScript можно разбить в следующие группы:

  • . (доступ к свойству),[] (доступ к свойству),() (вызов функции),new (создание нового объекта);
  • ++ (инкремент),-- (декремент),- (унарный минус),+ (унарный плюс),^ (поразрядное дополнение),! (логическое дополнение),delete (удаление свойства),typeof (определение примитивного типа данных),void (возврат неопределённого значения);
  • * (умножение),/ (деление),% (остаток от деления);
  • + (сложение),- (вычитание),+ (конкатенация строк);
  • << (сдвиг влево),>> (сдвиг вправо с расширением знакового разряда),>>> (сдвиг вправо с дополнением нулями);
  • < (меньше),<= (меньше или равно),> (больше),>= (больше или равно),instanceof (проверка типа объекта),in (проверка наличия свойства);
  • == (проверка на равенство),!= (проверка на неравенство),=== (проверка на идентичность),!== (проверка на неидентичность);
  • & (поразряднаяконъюнкция);
  • ^ (поразрядноесложение по модулю 2);
  • | (поразряднаядизъюнкция);
  • && (конъюнкция);
  • || (дизъюнкция);
  • ?: (тернарная условная операция);
  • = (присваивание),*=,/=,+=,-=,<<=,>>=,>>>=,&=,^=,|= (присваивание с операцией);
  • , (множественное вычисление)[21].

Операторы++,--,-,+,~,!,delete,typeof,void,?:,=,*=,/=,+=,-=,<<=,>=,>>>=,&=,^=,|= правоассоциативны (то есть для нихa op b op c эквивалентноa op (b op c)). Остальные операторы ECMAScript левоассоциативны[22].

Поарности операторы ECMAScript делятся на следующие группы:

  • унарные (delete,void,typeof,++,--,- (унарный минус),+ (унарный плюс),^,!,new)[Спецификация 15];
  • бинарные (.,[],(),*,/,%,+ (сложение),- (вычитание),+ (конкатенация строк),<<,>>,>>>,<,<=,>,>=,instanceof,in,==,!=,===,!==,&,^,|,&&,||,=,*=,/=,+=,-=,<<=,>=,>>>=,&=,^=,|=,,);
  • тернарные (?:)[23];
  • операторы, не имеющие фиксированного количества операндов (())[24].

По положению знака операции относительно операндов операторы ECMAScript делятся на следующие группы:

  • префиксные (например,new,++ (префиксный инкремент);
  • инфиксные (например,+,-);
  • постфиксные (например,++ (постфиксный инкремент),-- (постфиксный декремент).

Также операторы классифицируются по типуоперандов[25] и по характеру осуществляемого действия.

Особенности операторов ECMAScript

[править |править код]

В ECMAScript нет оператора, позволяющего проверить, относится ли свойство непосредственно к объекту или является унаследованным. Такая проверка осуществляется с помощью методаhasOwnProperty(). В связи с тем, что данный метод не является оператором, он может быть переписан любым другим свойством[26].

Оператор+ является единственным арифметическим оператором в языке, которыйперегружен для строковых аргументов. Если хотя бы один из операндов — строка,+ действует какконкатенатор, в противном случае выполняетсясложение[27][Спецификация 16].

В отличие от языков, гдеvoid является типом данных, в ECMAScript это оператор, возвращающий значениеundefined[28].

Оператор== осуществляет проверку на равенство поалгоритму, состоящему из 10 шагов, подразумевающему в ряде случаев преобразование типов[Спецификация 17], что, в конечном счёте, может привести к неочевидным результатам[29].

Пример результатов работы== (во всех перечисленных случаях значением оператора=== с теми же аргументами будетfalse):

alert("NaN"==NaN);// falsealert(NaN==NaN);// falsealert(true==1);// truealert(true==42);// falsealert(null==0);// falsealert(0=="");// truealert(""==0);// truealert("false"==false);// falsealert(false==0);// truealert(undefined==false);// falsealert(null==false);// falsealert(undefined==null);// truealert(" \t\r\n "==0);// true

Функции

[править |править код]
Основная статья:Функция (программирование)

Функции в ECMAScript являютсяобъектами[30][31]. Конструктор, с помощью которого они создаются —Function(). Функции, как и любые другие объекты, могут храниться в переменных, объектах и массивах, могут передаваться как аргументы в другие функции и могут возвращаться функциями. Функции, как и любые другие объекты, могут иметь свойства. Существенной специфической чертой функций является то, что они могут быть вызваны[30].

Задание функций

[править |править код]

В ECMAScript имеется два типа функций:

  • внутренние функции (например,parseInt),
  • функции, определённые в тексте программы.

Внутренние функции представляют собойвстроенные объекты (см.ниже), не обязательно реализованные на ECMAScript[Спецификация 18].

В тексте программы именованную функцию в ECMAScript можно определить одним из следующих способов:

// объявление функцииfunctionsum(arg1,arg2){returnarg1+arg2;}// задание функции с помощью инструкцииvarsum2=function(arg1,arg2){returnarg1+arg2;};// задание функции с использованием объектной формы записиvarsum3=newFunction("arg1","arg2","return arg1 + arg2;");

Последний способ наименее предпочтителен, посколькуде-факто сводится к заданию функции с помощью выражения, но при этом порождает двойную интерпретацию кода (дополнительная интерпретация возникает при передаче кода в конструктор), что может негативно отразиться на производительности[31].

Первые два способа дают похожий, но не идентичный эффект. Усугубляет ситуацию то, что инструкция, использующаяся при задании функции, может выглядеть очень похоже на объявление функции: во-первых, за ключевым словомfunction может следовать идентификатор[Спецификация 19], во-вторых, точка с запятой может быть опущена в силу механизма автодополнения строк точками с запятой[Спецификация 7].Пример:

// объявление функцииfunctionsum(arg1,arg2){returnarg1+arg2;}// задание функции с помощью выраженияvarsum2=functionsum(arg1,arg2){returnarg1+arg2;}functionbar(){};// использование объявления функции(functionbar(){})// использование соответствующей инструкции

Наиболее существенной разницей между заданием функции с использованием объявления и заданием функции с помощью выражения является то, что в первом случае создание переменной и присваивание ей в качестве значения функции осуществляются до выполнения кода при входе в контекст исполнения. Во втором случае переменная получает значение инициализатора при выполнении оператора присваивания. При создании же переменной, осуществляемом при входе в контекст исполнения, онаинициализируется значениемundefined[Спецификация 20][32] (подробнее см. в разделеОбъявление переменных).

Пример, иллюстрирующий разницу в порядке выполнения кода:

alert(sum(3,4));// 7: переменная sum к моменту выполнения этой строки уже создана и в качестве значения ей присвоена функцияfunctionsum(arg1,arg2){returnarg1+arg2;}alert(sum2(3,4));// ошибка: переменная sum2 к моменту выполнения этой строки уже создана, но в качестве значения ей присвоено undefinedvarsum2=function(arg1,arg2){returnarg1+arg2;};

Объявлением функций не следует пользоваться внутри условных конструкций[33], хотя в Gecko-браузерах это обработается интуитивным образом за счёт реализованного механизма функций как инструкций[34].

Присваивания функций

[править |править код]

Поскольку функции в ECMAScript являются объектами, то есть относятся кссылочному типу данных, идентификаторы функций являются переменными, хранящими ссылку на функцию. Проиллюстрировать это можно следующим кодом:

varsum=function(arg1,arg2){returnarg1+arg2;};alert(sum(3,4));// 7varsum2=sum;alert(sum2(4,2));// 6sum=null;alert(sum2(42,42));// 84

В выделенной строке следует обратить внимание на отсутствие оператора вызова функции (()) в правой части присваивания. Если бы в этой строке вместоsum было указаноsum(), переменнойsum2 присвоилась бы не функция, а результат её вызова. Ещё внимания заслуживает то, что после присваиванияsum2 указывает не на копию функции, а на ту самую функцию, на которую указываетsum.

Перегрузка функций

[править |править код]

В ECMAScriptперегрузка функций не относится к свойствам языка, а её эффект обеспечивается за счёт использования других механизмов.

Пример, показывающий отсутствие перегрузки функций:

functionsum(arg1,arg2){returnarg1+arg2;}functionsum(arg1,arg2,arg3){returnarg1+arg2+arg3;}alert(sum(3,4));// NaNalert(sum(3,4,5));// 12

Если объявлено несколько функций с одинаковыми названиями, более поздние объявленияперезаписывают ранние объявления[31].

Тем не менее, эффект перегрузки функций достижим.

1. Проверка на undefined.Для того, чтобы проверить, передан ли в функцию фактический аргумент, можно осуществить проверку формального аргумента на идентичность значениюundefined. Например:

functionsum(arg1,arg2,arg3){if(arg3!==undefined){returnarg1+arg2+arg3;}else{returnarg1+arg2;}}alert(sum(3,4));// 7alert(sum(3,4,5));// 12

2. Проверка типа.Кроме того,typeof,instanceof,constructor могут быть использованы для выяснения типа фактических аргументов и кастомизации поведения функции в зависимости от них.

functionsum(arg1,arg2,arg3){switch(typeofarg3){case"undefined":returnarg1+arg2;case"number":returnarg1+arg2+arg3;default:returnarg1+arg2+" ("+arg3+")";}}alert(sum(3,4));// 7alert(sum(3,4,5));// 12alert(sum(3,4,"!"));// "7 (!)"

3. Обращение к данным об аргументах.В функциях ECMAScript можно получить доступ к данным об аргументах с помощью объектаarguments[Спецификация 21]. Он, в частности, позволяет воспользоваться индексированием для доступа к конкретным переданным аргументам[31][35] и свойствомlength, хранящем количество фактически переданных аргументов, что может быть полезно при применении парадигмыобобщённого программирования.

functionsum(){varres=0;for(vari=0;i<arguments.length;i++){res+=arguments[i];}returnres;}alert(sum(3,4));// 7alert(sum(3,4,5));// 12alert(sum(3,4,5,7,9));// 28

Рекурсия

[править |править код]
Основная статья:Рекурсия § В программировании

Функции ECMAScript допускают рекурсивный вызов. При задании функции с помощью инструкции без указания идентификатора после ключевого словаfunction внутри функции можно обратиться к ней с помощью свойства callee объектаarguments[Спецификация 21].

Пример рекурсивного вычисления факториала:

varfactorial=function(step,res){res=res||1;if(step<2){returnres;}returnarguments.callee(step-1,step*res);};alert(factorial(5));// 120

Функции обратного вызова

[править |править код]
Основная статья:Callback (программирование)

В ECMAScript функция представляет собой объект первого класса и может быть передана в другую функцию как аргумент. Если она при этом вызывается в функции, в которую передаётся, то её называютфункцией обратного вызова (илиcallback-функцией). Если при этом передаваемая функция не имеет имени, этоанонимная функция обратного вызова (анонимная callback-функция)[36]. Основные причины использования функций обратного вызова:

  • избежание именования функции при оперировании с ней (способствует снижению числа глобальных переменных)[36],
  • делегирование вызова функции другой функции (способствует повышению выразительности кода)[36],
  • увеличение быстродействия[36],
  • упрощение оперирования с непродолжительными событиями[37].

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

functionsumOfResults(callback){varresult=0;for(vari=1;i<arguments.length;i++){result+=callback(arguments[i]);}returnresult;}varsquare=function(x){returnx*x;};alert(sumOfResults(square,3,4));// 25

Замыкания

[править |править код]
Основная статья:Замыкание (программирование)

Функциям в ECMAScript присуща лексическая область видимости. Это означает, что область видимости определяется в момент определения функции (в отличие от динамической области видимости, при которой область видимости определяется в момент вызова функции)[38].

При объявлении функции последовательность областей видимости, относящихся ко вложенным функциям, сохраняется как составляющая состояния функции. То есть в процессе выполнения программы функции, обладающие доступом к локальным переменным объемлющих функций, сохраняют такой доступ на протяжении всего выполнения программы[38].

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

(function(){// Участок программы, доступ к переменным которого необходимо изолировать извне.})();

При этом определённые в участке программы функции становятся вложенными по отношению к добавленной анонимной функции и в них возможно осуществление доступа к локальным переменным анонимной функции (которые до её введения были глобальными). Однако извне анонимной функции доступ к ним осуществить нельзя: результат выполнения функции игнорируется.

Замыкания используются не только для запрещения доступа к ряду переменных, но и к модификации такого доступа. Это достигается с помощью функций, возвращающих другие функции.Пример функции-генератора последовательных чисел:

varuniqueId=function(){varid=0;returnfunction(){returnid++;};}();varaValue=uniqueId();varanotherValue=uniqueId();

За счёт использования замыкания доступ к переменнойid имеет только функция, которая была присвоена переменнойuniqueId.

Примеркарринга:

varmultNumber=function(arg){returnfunction(mul){returnarg*mul;};};varmultFive=multNumber(5);alert(multFive(7));//35

Пример создания объекта, позволяющего осуществить доступ к свойству исключительно с помощью своих методов[39]:

varmyObject=function(){varvalue=0;return{increment:function(inc){value+=typeofinc==='number'?inc:1;},getValue:function(){returnvalue;}}}();alert(myObject.value===undefined);// truealert(myObject.getValue());// 0myObject.increment(9)myObject.increment(7)alert(myObject.getValue());// 16

Пользуясь этим приёмом, можно использовать замыкание для эмуляцииконстант[40].

vargetConstant=function(){varconstants={UPPER_BOUND:100,LOWER_BOUND:-100};returnfunction(constantName){returnconstants[constantName];};}();alert(getConstant("LOWER_BOUND"));// -100

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

[править |править код]
Основная статья:Регулярные выражения

Синтаксис и функциональность регулярных выражений в ECMAScript сформировались под влияниемPerl 5[Спецификация 22] и допускают два вида синтаксиса:литеральный иобъектный.

varliteralWay=/pattern/flags;varobjectWay=newRegExp(pattern,flags);

В первом случае шаблон (pattern) и флаги (flags) указываются явно, не сопровождаясь дополнительными избыточными синтаксическими знаками: их разделителями служатслеши. Во втором случае шаблон и флаги должны представлять собой переменные, содержащие строковые значения, либо непосредственно строковые значения. Литеральная форма записи предпочтительнее тем, что не требует двойного[~ 2]экранирования метасимволов регулярных выражений, в отличие от объектной формы[41].

В качестве флагов в ECMAScript могут использоваться следующие символы:

Флаги регулярных выражений[41][Спецификация 22]
ФлагОписание
gглобальный режим: шаблон применяется ко всем соответствиям в строке, работа регулярного выражения не останавливается после первого найденного соответствия шаблону
iигнорированиерегистра: при поиске соответствий регистр символов шаблона и строки игнорируются
mмногострочный режим: строка, содержащаясимволы перевода строки, трактуется как несколько строк, разделённых символами перевода строки; работа регулярного выражения осуществляется во всех строках

Каждое регулярное выражение представляет собойобъект со следующими свойствами:

Свойства объектарегулярное выражение в ECMAScript[41][Спецификация 22]
СвойствоТипОписание
globalлогическийпоказывает, установлен ли флагg
ignoreCaseлогическийпоказывает, установлен ли флагi
multilineлогическийпоказывает, установлен ли флагm
lastIndexчисловойсоответствуетномеру позиции в строке, в которой обнаружилось совпадение с шаблоном в результате предыдущего применения регулярного выражения или 0, если регулярное выражение ранее не применялось
sourceстроковыйстрока, соответствующая шаблону регулярного выражения

Кроме того, для регулярных выражений определены следующие методы:

Методы объектарегулярное выражение в ECMAScript[41][Спецификация 22]
МетодТип возвращаемого значенияОписание
exec(handledString)объектный (массив) илиnullформирует массив подстрок, соответствующих заданномушаблону с учётом выставленныхфлагов.null, если никакая подстрока не соответствуетшаблону
test(handledString)логическийtrue, если нашлась строка, соответствующаяшаблону иfalse в противном случае

Объекты

[править |править код]

Реализация в языке

[править |править код]

Объекты ECMAScript представляют собой неупорядоченныеколлекциисвойств, каждое из которых имеет один или болееатрибутов, которые определяют, как может быть использовано свойство — например, если в качестве значения атрибута ReadOnly установленаистина, то любая попытка выполняющегося ECMAScript-кода поменять значение этого свойства останется безрезультатной.Свойства представляют собойконтейнеры,инкапсулирующие другие объекты, значения примитивных типов и методы[Спецификация 23].

Атрибуты свойств объектов ECMAScript[Спецификация 24]
НазваниеОписание
ReadOnlyСвойство является свойством только для чтения. Попытка поменять значение этого свойства, предпринятая в программе, останется безрезультатной. В некоторых случаях значение свойства с установленным атрибутом ReadOnly меняется в силу действий среды расширения языка, поэтому ReadOnly не следует понимать как неизменное
DontEnumСвойство не перечисляется цикломfor-in
DontDeleteПопытки удалить это свойство будут проигнорированы
InternalСвойство является внутренним. Оно не имеет названия и к нему нельзя получить доступ с помощьюаксессоров. Доступ к этим свойствам определяется реализацией языка.

Объекты ECMAScript подразделяются набазовые (native) иобъекты расширения (host). Под базовыми понимаются любые объекты, независимые от окружения, относящегося к расширению языка. Некоторые из базовых объектов являютсявстроенными (built-in): существующими с самого начала выполнения программы. Другие могут быть созданы, когда программа выполняется. Объекты расширения предоставляются расширением ECMAScript, а для ECMAScript это значит, что они входят в объектную модель документа или в объектную модель браузера[Спецификация 3].

Синтаксис

[править |править код]

Для задания объектов может использоваться объектная и литеральная формы. Объектная форма задания объекта имеет синтаксис, аналогичный Java, но, в отличие от него, скобки в ECMAScript требуется использовать только при передаче аргументов в конструктор[42]. Синтаксически следующие записи эквивалентны:

varobj1=newObject();varobj2=newObject;varobj3={};

Однако второй вариант использовать не рекомендуется[42].Дуглас Крокфорд рекомендует избегать и первого варианта, отдавая предпочтение литеральной форме, которую он считает большим достоинством языка[43].

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

Каждый объект в языке имеет следующие свойства:

Свойства объектов ECMAScript[42]
НазваниеКраткое описание
constructorФункция, использованная для создания объекта (в примерах выше этоObject())
hasOwnProperty(propertyName)Показывает, существует ли данное свойство в объекте (не в егопрототипе)
isPrototypeOf(object)Определяет, находится ли объект в цепи прототипов объекта-аргумента
propertyIsEnumerable(propertyName)Показывает, является ли свойство с данным названием перечислимым в циклеfor-in
toString()Возвращает представление объекта в виде строки
valueOf()Возвращает значениеthis. Если же объект является результатом вызова конструктораобъекта расширения, значениеvalueOf() зависит от реализации[Спецификация 25]. Зачастую в качестве возвращаемого значения выступает значение примитивного типа, соответствующее объекту. Как правило, результат данного метода совпадает с результатомtoString(). Объекты, созданные с помощью конструктораDate() — яркий пример, где результатыtoString() иvalueOf() не совпадают[42].

Доступ к свойствам объекта осуществляется использованиемточечной искобочной записи:

varobj=newObject();alert(obj.constructor===obj["constructor"]);// true — использование точечной и скобочной записи для доступа к свойствуvarfoo=obj["toString"];// использование скобочной записи для сохранения функции в переменнуюvarresult=obj["toString"]();// сохранение результата вызова функции в переменнуюalert(foo());// вывод на экран результата вызова сохранённой функцииalert(result);varboo=obj.toString;// аналогично с использованием точечной записиvarres=obj.toString();alert(boo());alert(res);

Задание новых свойств может осуществляться динамически.

varcountry=newObject();country["name"]="Russia";// использование скобочной записиcountry.foundationYear=862;// использование точечной записиvarcountry2={"name":"Russia","foundationYear":862};// использование литеральной формы

Подходы к созданию объектов

[править |править код]

Создание объектов описанным в предыдущем разделе способом может быть непрактичным из-за необходимости дублировать код[44]. Если в программе происходит манипуляция с большим количеством однотипных объектов, разработчик имеет возможность выбрать одну из используемых в языке техник[44]:

фабрика объектов
функция, создающая объект и возвращающая его в качестве своего значения,
конструктор
функция, использующая ключевое словоthis для формирования свойств объекта, создаваемого ей с помощью оператораnew,
прототипный подход
задействование свойстваprototype функции для вынесения общих свойств объектов,
смешанный подход конструктор-прототип
использование конструктора для задания свойств объектов, не являющихся методами и прототипного подхода — для задания методов,
метод динамического прототипа
заключение кода, относящегося к функции создания объектов на основе смешанного подхода конструктор-прототип, в неё одну с обеспечением однократности присваивания свойств прототипа,
метод паразитического конструктора
использованиеnew с функцией фабрики объектов.

В языке нетклассов, однако их можно эмулировать за счёт использования конструкторов. Пример эмуляции класса в ECMAScript:

functionMyClass(){this.myValue1=1;this.myValue2=2;}MyClass.prototype.myMethod=function(){returnthis.myValue1*this.myValue2;}varmc=newMyClass();mc.myValue1=mc.myValue2*2;vari=mc.myMethod();

Особенности наследования в ECMAScript

[править |править код]

Для каждой из составляющих объекта можно рассматривать наследование. При наследовании интерфейса родителя без того, чтобы потомок использовал функциональность предка, говорят о наследовании интерфейса.При наследовании состояния осуществляется наследование объектом-потомком структуры данных объекта-предка.При наследовании функциональности речь идёт о наследовании вместе с интерфейсом и кода методов. Как правило, это влечёт необходимость организации наследования состояния, что делает разумным объединение наследования состояния и наследования функциональности в наследование реализации[45].

В отношении ECMAScript неприменимо лишь наследование интерфейсов, поскольку функции в языке не имеютсигнатур[44].

О возможностях, предоставляемых языком для организации наследования, можно судить, например, по приводимому[46]Стояном Стефановым списку из двенадцати разных способов организации наследования.

ECMAScript 6

[править |править код]

Принятие ES6 устранило многие классы проблем JavaScript[47][48][49][50].

Примечания

[править |править код]
  1. 12345Dr. Axel Rauschmayer. The Nature of JavaScript // Speaking JavaScript. — First Edition. — O’Reilly Media, 2014. — P. 41. —ISBN 978-1-449-36503-5. — [Архивировано 10 мая 2015 года.]
  2. Scripting Media Type — 2006.
  3. Zakas N. ECMAScript // Professional JavaScript for Web Developers. — 2nd ed. — USA, Canada: Wiley Publishing, Inc, 2009. — P. 3—7. —ISBN 978-0-470-22780-0.
  4. Aiken A., Applegate M., Bailey D. and others. 6.2. Operations with NaNs // IEEE Standard for Floating-Point Arithmetic / Chair Zuras D., Editor Cowlishaw M. — USA, 2008. — P. 34. —ISBN 978-0-7381-5753-5.
  5. 12Дэвид Флэнаган. 3. Типы данных и значения // JavaScript. Подробное руководство = JavaScript. The Definite Guide / Перевод А. Киселева. — 5-е изд. —СПб.:«Символ-Плюс», 2008. — С. 39—66. —ISBN 5-93286-103-7.
  6. Jensen S., Møller A., Thiemann P. Type Analysis for JavaScript (недоступная ссылка —история) (англ.) // Lecture Notes in Computer Science : Материалы конф. / The 16th International Static Analysis Symposium (SAS 2009), Лос-Анджелес, США, 9 – 11 августа 2009. — Springer Berlin / Heidelberg, 2009. —Vol. 5673. —P. 238 — 255. —ISBN 978-3-642-03236-3.
  7. Crockford D. A.3. Semicolon Insertion // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  8. Dr. Axel Rauschmayer. JavaScript’s Syntax // Speaking JavaScript. — First Edition. — O’Reilly Media, 2014. — P. 378. —ISBN 978-1-449-36503-5. — [Архивировано 10 мая 2015 года.]
  9. Dr. Axel Rauschmayer. JavaScript’s Syntax // Speaking JavaScript. — First Edition. — O’Reilly Media, 2014. — P. 41. —ISBN 978-1-449-36503-5. — [Архивировано 10 мая 2015 года.]
  10. 12Crockford D. A.2. Scope // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  11. Дэвид Флэнаган. 4.3.1. Отсутствие блочной области видимости // JavaScript. Подробное руководство = JavaScript. The Definite Guide / Перевод А. Киселева. — 5-е изд. —СПб.:«Символ-Плюс», 2008. — С. 70—71. —ISBN 5-93286-103-7.
  12. 12Сошников, Дмитрий. Тонкости ECMA-262-3. Часть 2. Объект переменных.  (27 июня 2009). Дата обращения: 6 ноября 2009. Архивировано 18 февраля 2012 года.
  13. Дэвид Флэнаган. 4.2. Объявление переменных // JavaScript. Подробное руководство = JavaScript. The Definite Guide / Перевод А. Киселева. — 5-е изд. —СПб.:«Символ-Плюс», 2008. — С. 68. —ISBN 5-93286-103-7.
  14. Koch Peter-Paul. Implicit variable declaration // ppk on JavaScript / Editor: Wendy Sharp. — 1st ed. — New Riders Press, 2006. — 528 p. —ISBN 978-0-321-42330-6.
  15. Zakas N. Variables // Professional JavaScript for Web Developers. — 2nd ed. — USA, Canada: Wiley Publishing, Inc, 2009. — P. 26, 27. —ISBN 978-0-470-22780-0.
  16. Souders S. Use Local Variables // Even Faster Web Sites: Performance Best Practices for Web Developers. — 1st ed. — USA: O'Reilly Media, 2009. — P. 81—83. —ISBN 0596522304.
  17. Easttom C. Variable Declaration // Advanced Javascript. — 3rd ed. — USA: Wordware Publishing, Inc, 2008. — 81 — 83 p. —ISBN 1-59822-033-0.
  18. Keith J. Variables // DOM Scripting: Web Design with JavaScript and the Document Object Model. — 1st ed. — USA: Wordware Publishing, Inc, 2005. — 18 — 20 p. —ISBN 1590595335.
  19. Koch Peter-Paul. Chapter 5. Core. Section D. Variables // ppk on JavaScript / Editor: Wendy Sharp. — 1st ed. — New Riders Press, 2006. — 528 p. —ISBN 978-0-321-42330-6.
  20. Crockford D. A.4. Reserved Words // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  21. Дэвид Флэнаган. 5.2. Обзор операторов // JavaScript. Подробное руководство = JavaScript. The Definite Guide / Перевод А. Киселева. — 5-е изд. —СПб.:«Символ-Плюс», 2008. — С. 78—79. —ISBN 5-93286-103-7.
  22. Дэвид Флэнаган. 5.2.4 Ассоциативность операторов // JavaScript. Подробное руководство = JavaScript. The Definite Guide / Перевод А. Киселева. — 5-е изд. —СПб.:«Символ-Плюс», 2008. — С. 81. —ISBN 5-93286-103-7.
  23. Дэвид Флэнаган. 5.2.1 Количество операндов // JavaScript. Подробное руководство = JavaScript. The Definite Guide / Перевод А. Киселева. — 5-е изд. —СПб.:«Символ-Плюс», 2008. — С. 79. —ISBN 5-93286-103-7.
  24. Дэвид Флэнаган. 5.10.8 Оператор вызова функции // JavaScript. Подробное руководство = JavaScript. The Definite Guide / Перевод А. Киселева. — 5-е изд. —СПб.:«Символ-Плюс», 2008. — С. 98. —ISBN 5-93286-103-7.
  25. Дэвид Флэнаган. 5.2.2 Тип операндов // JavaScript. Подробное руководство = JavaScript. The Definite Guide / Перевод А. Киселева. — 5-е изд. —СПб.:«Символ-Плюс», 2008. — С. 80. —ISBN 5-93286-103-7.
  26. Crockford D. A.13. hasOwnProperty // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  27. Crockford D. A.8. + // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  28. Crockford D. B.12. void // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  29. Crockford D. B.1. == // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  30. 12Crockford D. 4.1. Function Objects // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  31. 1234Zakas N. The Function Type // Professional JavaScript for Web Developers. — 2nd ed. — USA, Canada: Wiley Publishing, Inc, 2009. — P. 122—130. —ISBN 978-0-470-22780-0.
  32. Сошников, Дмитрий. Тонкости ECMA-262-3. Часть 1. Контексты исполнения.  (26 июня 2009). Дата обращения: 12 октября 2010. Архивировано 16 октября 2010 года.
  33. Juriy "kangax" Zaytsev. Named function expressions demystified (англ.). — Статья, детально описывающая разницу между заданием функции с помощью объявления и заданием функции с помощью выражения. Дата обращения: 19 октября 2009. Архивировано изоригинала 19 июня 2009 года.
  34. Maian и др. Conditionally defining a function (англ.). Functions and function scope. — Описание деталей реализации функций как выражений в контексте объявлений внутри условий. Дата обращения: 19 октября 2009. Архивировано изоригинала 14 октября 2008 года.
  35. Crockford D. 4.4. Arguments // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  36. 1234Stefanov S. Callback Functions // Object-Oriented #"#cite_ref-64">↑Crockford D. 4.11. Callbacks // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  37. 12Дэвид Флэнаган. 8.8. Область видимости функций и замыкания // JavaScript. Подробное руководство = JavaScript. The Definite Guide / Перевод А. Киселева. — 5-е изд. —СПб.:«Символ-Плюс», 2008. — С. 156—163. —ISBN 5-93286-103-7.
  38. Crockford D. 4.10. Closure // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  39. Harmes R., Diaz D. Constants // Pro JavaScript™ Design Patterns. — USA: Apress, 2008. — P. 37, 38. —ISBN 1-59059-908-X.
  40. 1234Zakas N. The RegExp Type // Professional JavaScript for Web Developers. — 2nd ed. — USA, Canada: Wiley Publishing, Inc, 2009. — P. 115—122. —ISBN 978-0-470-22780-0.
  41. 1234Zakas N. The Object Type // Professional JavaScript for Web Developers. — 2nd ed. — USA, Canada: Wiley Publishing, Inc, 2009. — P. 40—41. —ISBN 978-0-470-22780-0.
  42. Crockford D. JSON // #"/wiki/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%98%D1%81%D1%82%D0%BE%D1%87%D0%BD%D0%B8%D0%BA%D0%B8_%D0%BA%D0%BD%D0%B8%D0%B3/9780596517748">ISBN 978-0-596-51774-8.
  43. 123Zakas N. 6. Object-Oriented Programming // Professional JavaScript for Web Developers. — 2nd ed. — USA, Canada: Wiley Publishing, Inc, 2009. — P. 151—182. —ISBN 978-0-470-22780-0.
  44. Кузнецов, Михаил. Наследование реализации в распределённых объектных системах . Издательство «Открытые системы» (11 декабря 2002). Дата обращения: 1 ноября 2009. Архивировано 17 февраля 2010 года.
  45. Stefanov S. Chapter 6. Inheritance. Summary // Object-Oriented #"#cite_ref-79">↑ECMAScript 6 . Дата обращения: 17 марта 2017. Архивировано 20 декабря 2016 года.
  46. Введение в JS итераторы на ES6 . Дата обращения: 17 марта 2017. Архивировано 10 июня 2017 года.
  47. ES6 Введение . Дата обращения: 17 марта 2017. Архивировано 20 декабря 2016 года.
  48. Стрелочные функции ES6 . Дата обращения: 17 марта 2017. Архивировано 20 декабря 2016 года.

Спецификации ECMAScript

[править |править код]
  1. Standard ECMA-262. 15th edition . ecma-international.org (июнь 2024). Дата обращения: 30 августа 2024. Архивировано 28 августа 2024 года.
  2. TC39. Introduction // ECMAScript Language Specification. — 15th ed. — 2024. — [Архивировано 12 февраля 2025 года.]
  3. 123TC39. 4.3. Definitions // ECMAScript Language Specification. — 15th ed. — 2024. — [Архивировано 12 февраля 2025 года.]
  4. TC39. 6.1.6.1 The Number Type // ECMAScript Language Specification. — 15th ed. — 2024. — [Архивировано 12 февраля 2025 года.]
  5. TC39. 6.2 ECMAScript Specification Types // ECMAScript Language Specification. — 15th ed. — 2024. — [Архивировано 12 февраля 2025 года.]
  6. TC39. 12. Statements // ECMAScript Language Specification. — 5th ed. — 2009. — P. 86—97. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  7. 1234TC39. 7.9. Automatic Semicolon Insertion // ECMAScript Language Specification. — 5th ed. — 2009. — P. 25—28. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  8. TC39. 12. Statements // ECMAScript Language Specification. — 3rd ed. — 1999. — P. 61—71. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  9. 123TC39. 12.2. Variable Statement // ECMAScript Language Specification. — 5th ed. — 2009. — P. 87, 88. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  10. TC39. 10.2.2. Eval Code // 3rd edition, December 1999.pdf ECMAScript Language Specification. — 3rd ed. — 1999. — P. 39. (недоступная ссылка)
  11. TC39. 7.6.1.1. Keywords // ECMAScript Language Specification. — 5th ed. — 2009. — P. 18. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  12. TC39. 7.5.2. Keywords // 3rd edition, December 1999.pdf ECMAScript Language Specification. — 3rd ed. — 1999. — P. 13—14. (недоступная ссылка)
  13. 12TC39. 7.6.1. Reserved Words // ECMAScript Language Specification. — 5th ed. — 2009. — P. 18, 19. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  14. TC39. 7.5.3. Future Reserved Words // 3rd edition, December 1999.pdf ECMAScript Language Specification. — 3rd ed. — 1999. — P. 15. (недоступная ссылка)
  15. TC39. 11.4. Unary Operators // ECMAScript Language Specification. — 5th ed. — 2009. — P. 70—72. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  16. TC39. 11.6.1 The Addition operator ( + ) // ECMAScript Language Specification. — 5th ed. — 2009. — P. 74, 75. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  17. TC39. 11.9.3. The Abstract Equality Comparison Algorithm // ECMAScript Language Specification. — 5th ed. — 2009. — P. 80, 81. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  18. TC39. 4.3. Definitions // ECMAScript Language Specification. — 5th ed. — 2009. — P. 4—7. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  19. TC39. 13 Function Definition // ECMAScript Language Specification. — 5th ed. — 2009. — P. 97, 98. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  20. TC39. 12.2 Variable Statement // ECMAScript Language Specification. — 5th ed. — 2009. — P. 87, 88. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  21. 12TC39. 10.6. Arguments Object // ECMAScript Language Specification. — 5th ed. — 2009. — P. 60—62. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  22. 1234TC39. 15.10. RegExp (Regular Expression) Objects // ECMAScript Language Specification. — 5th ed. — 2009. — P. 179—196. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  23. TC39. 4.2. Language Overview // ECMAScript Language Specification. — 5th ed. — 2009. — P. 2—4. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  24. TC39. 8.6.1. Property attributes // ECMAScript Language Specification. — 3rd ed. — 1999. — P. 25, 26. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.
  25. TC39. Properties of the Object Prototype Object // ECMAScript Language Specification. — 5th ed. — 2009. — P. 114—116. — [Архивировано 12 апреля 2015 года.]Архивированная копия . Дата обращения: 11 ноября 2009. Архивировано 12 апреля 2015 года.

Комментарии

[править |править код]
  1. Только в отношенииdo-while
  2. Однимобратным слешем экранируются метасимволы строк (например,\t). Для экранирования метасимволов регулярных выражений используетсядвойной обратный слеш (например,\\s)

Стандарты оформления кода JavaScript

[править |править код]
  1. 123Crockford, Douglas. Code Conventions for the JavaScript Programming Language (англ.). Douglas Crockford's JavaScript. — Стандарт оформления кода JavaScript Дугласа Крокфорда. Дата обращения: 5 октября 2009. Архивировано 18 февраля 2012 года.
  2. 12JavaScript Code Conventions (англ.). Echo Web Framework. NextApp, Inc. — Стандарт оформления кода JavaScript, принятый для Echo Web Framework. Дата обращения: 5 октября 2009. Архивировано 18 февраля 2012 года.
  3. Amaram, Rahul. Javascript Naming Conventions, Coding Guidelines and Best Practices (англ.). Echo Web Framework. — Стандарт оформления кода JavaScript Рауля Амарама. Дата обращения: 5 октября 2009. Архивировано 18 февраля 2012 года.
  4. 123Komenda, Klaus. JavaScript Coding Guidelines and Standards (англ.). Сайт австрийского веб-разработчика Клауса Коменда. — Стандарт оформления кода JavaScript Клауса Коменда. Дата обращения: 5 октября 2009. Архивировано 18 февраля 2012 года.
  5. JavaScript coding style (англ.). GNOME. — Стандарт оформления кода JavaScript в GNOME. Дата обращения: 24 декабря 2009. Архивировано 18 февраля 2012 года.

Ссылки

[править |править код]
Перейти к шаблону «ECMAScript»
Диалекты
Движки[англ.]
(сравнение[англ.])
Фреймворки,
библиотеки
JavaScript
(сравнение[англ.])
Client-side
Server-side
Библиотеки
(список[англ.])
ActionScript
Множественные
реализации
Люди
Другое
Перейти к шаблону «Ecma International Standards»
СтандартыEcma International
Перейти к шаблону «Стандарты ISO»
СтандартыISO
1
по
9999
10000
по
19999
20000+
Источник —https://ru.wikipedia.org/w/index.php?title=ECMAScript&oldid=149825487
Категории:
Скрытые категории: