ECMAScript | |
---|---|
Jazyková třída | Specifikace pro programovací jazyky , funkční programovací jazyk a multiparadigmový programovací jazyk |
Objevil se v | června 1997 |
Autor | Brendan Eich a Ecma International |
Vývojář | Brendan Eich |
Přípona souboru | .es[2] |
Uvolnění | ECMAScript 2022 [Spec 1] (červen 2022 ) |
Typový systém | kachna |
Dialekty | JavaScript , JScript , ActionScript , JScript.NET , QtScript |
Byl ovlivněn | Self [1] , C , Schéma [1] , Perl [1] , Python , Java [1] , AWK [1] |
ovlivnil | Cíl-J |
webová stránka | ecma-international.org _ |
ECMAScript je vložitelný, rozšiřitelný programovací jazyk bez I/O používaný jako základ pro vytváření dalších skriptovacích jazyků [3] .
ECMAScript je standardizován mezinárodní organizací ECMA ve specifikaci ECMA-262 . Rozšíření jazyka: JavaScript , JScript a ActionScript .
Jazyk vznikl z několika technologií, z nichž nejznámější jsou jazyky JavaScript a JScript . Vývoj první revize specifikace začal v listopadu 1996. Specifikace byla přijata v červnu 1997. Byl předložen ISO/IEC JTC 1 k přijetí Fast-Tracking a sloužil jako základ pro mezinárodní normu ISO/IEC 16262 . V červnu 1998 přijala valná hromada ECMA druhé vydání ECMA-262, odpovídající ISO / IEC 16262. Třetí vydání specifikace se od předchozího lišilo zavedením podpory regulárních výrazů, zlepšením podpory řetězců, zavedením nových řídicích struktur , mechanismus výjimek, formátování při numerickém vstupu a některé další změny[Specifikace 2] .
ECMAScript podporuje pět primitivních datových typů :
Číselný datový typ v ECMAScript odpovídá 64bitovému formátu čísel s plovoucí desetinnou čárkou definovanému standardem IEEE 754-2008 , kromě toho, že různé hodnoty Not-a-Number definované ve standardu [4] jsou reprezentovány v tomto jazyce. jedinou speciální hodnotou NaN [Specifikace 4] .
Nulové a nedefinované datové typy jsou Davidem Flanaganem neformálně označovány jako „triviální“ typy , protože každý z nich definuje pouze jednu hodnotu [5] .
Jazyk má také "složený" datový typ [5] :
Kromě uvedených šesti datových typů podporuje ECMAScript sedm dalších, které se používají výhradně k ukládání mezivýsledků hodnocených výrazů:
Popularita jazyka JavaScript a netriviálnost zpracování dat různých typů vedla k nasazení akademického výzkumu v oblasti parsování datových typů ECMAScript, jehož cílem je vytvořit plnohodnotný analyzátor kódu, který by mohl být použit v integrovaném vývoji prostředí [6] .
V ECMAScriptu je patnáct různých druhů instrukcí, které jsou uvedeny v tabulce níže:
Typy instrukcí definované specifikací jazyka [Specifikace 7]název | původní název | Stručné informace | Konečná ; [Specifikace 8] |
---|---|---|---|
Blok | Angličtina blok | {[<instrukce>]} | − |
Deklarace proměnné | Angličtina VariableStatement | var <seznam deklarací proměnných> | + |
Prázdná instrukce | Angličtina EmptyStatement | ; | + |
Výraz | Angličtina ExpressionStatement | [string to ∉ {{, function}] příkaz | + |
Stav | Angličtina IfStatement | if (<инструкция>) <выражение>[ else <выражение>] | − |
Cyklus | Angličtina IterationStatement | udělat <výraz> zatímco (<příkaz>) while (<příkaz>) <výraz> |
+/− [~1] |
Pokračování | Angličtina Pokračovat v prohlášení | pokračovat [<identifikátor>] | + |
Přerušit | Angličtina BreakStatement | zlom [<identifikátor>] | + |
Vrátit se | Angličtina ReturnStatement | vrátit [<instrukce>] | + |
Kombinace | Angličtina S prohlášením | s (<příkaz>) <výraz> | − |
Označení | Angličtina LabelledStatement | <identifikátor>: <výraz> | − |
Výběr | Angličtina SwitchStatement | přepínač (<příkaz>) případ <příkaz>: [<výrazy>][ případ <příkaz>: [<výrazy>] ...] [výchozí: [<výrazy>]] | − |
Vyhození výjimky | Angličtina ThrowStatement | hodit <návod> | + |
zkuste blokovat | Angličtina TryStatement | zkuste <blok> chytit (<identifikátor>) <blok> zkuste <blok> nakonec <blok> zkuste <blok> chytit (<identifikátor>) <blok> nakonec <blok> |
− |
(nový [Spec 9] ) Debugger | Angličtina Debugger | debugger | − |
Přes povinný středník v případech uvedených ve čtvrtém sloupci specifikace deklaruje mechanismus automatického doplňování řetězců středníky , což vede k tomu, že pokud dojde k zalomení řádku, může být instrukce před zalomením řádku vybavena tímto znakem [ Specifikace 8] , která je předmětem kritiky [7] .
Pokyny, které mění význam při použití nového řádku uvnitř [Specifikace 8]Příklad změny významu pokynu
return { stav : "dokončeno" };Zde zvýrazněný řádek obsahuje instrukci platnou pro daný jazyk, a protože následuje nový řádek, spustí se mechanismus automatického doplňování řádků středníky. Místo toho, aby funkce obsahující výše uvedený kód vracela objekt s vlastností jako hodnotou status, vrátí se undefined.
Ačkoli doslovná forma objektu není blok kódu, jednotné závorky mohou vést k chybám. Vývoj nebo přijetí vhodného standardu kódování může snížit pravděpodobnost jejich výskytu . Roli hraje volba stylu odsazení . Zejména styly Allman a Whitesmith , stejně jako styl Horstman a styl GNU pro kód JavaScript, jsou většinou směrnic [8] zavrženy na rozdíl od stylů K&R , 1TBS , BSD KNF .
Selhání automatického doplňováníPokud výraz zapsaný na dalším řádku může být syntakticky pokračováním výrazu na předchozím řádku, nefunguje mechanismus automatického doplňování řádků středníky [9] .
func () [ 'h1' , 'h2' ]. forEach ( function ( t ) { handleTag ( t ) })V tomto příkladu jsou hranaté závorky na druhém řádku interpretovány jako odkaz na prvek pole vrácený funkcí func(). Čárka v závorce je považována za odpovídající operátor vracející 'h2'. Kód je tedy převeden na následující:
func ()[ 'h2' ]. forEach ( function ( t ) { handleTag ( t ); });V kódovacích standardech je obvyklé vyžadovat středníky, i když syntaxe jazyka umožňuje jejich vynechání [Coding Standards 1] [Coding Standards 2] [Coding Standards 3] [Coding Standards 4] [Coding Standards 5] .
Bloky a rozsahDalším rysem ECMAScriptu ve vztahu k jiným jazykům podobným C je to, že v tomto jazyce bloky netvoří rozsah . Proměnné deklarované v bloku platí pro celou funkci obsahující blok [10] [11] .
V této části kódu je proměnná znovu deklarována ve zvýrazněných řádcích:
function foo ( ) { varsum = 0 ; for ( var i = 0 ; i < 42 ; i += 2 ) { var tmp = i + 2 ; součet += i * tmp ; } for ( var i = 1 ; i < 42 ; i += 2 ) { součet += i * i ; } alert ( tmp ); návratový součet ; _ } foo ();Kromě toho proměnná tmp deklarovaná uvnitř první smyčky (řádek 4) je legální pro přístup z vnější smyčky (řádek 10) podle syntaxe jazyka.
Vzhledem k povaze rozsahu a bloků se doporučuje deklarovat proměnné na začátku funkcí , aby byla zachována kvalita zdrojového kódu [10] [Standardy kódování 1] [Standardy kódování 4] .
Deklarace proměnnýchProměnné jsou definovány pomocí klíčových slov var, let, const. Při deklaraci proměnné je umístěna v rozsahu odpovídajícím v případě varfunkce a v případě let, constbloku kódu. Pokud je proměnná deklarována mimo funkce, je umístěna do globálního rozsahu. K vytvoření proměnné dochází, když je přijato ovládání funkce s její deklarací. Nebo program, pokud je proměnná globální. Když je proměnná vytvořena v ECMAScriptu, získá hodnotu undefined. Pokud je proměnná deklarována s inicializací , k inicializaci nedojde v okamžiku vytvoření proměnné, ale při provedení řádku s instrukcí var[Specifikace 10] .
Při zrušení komentáře u vybraného řádku se na obrazovce nezobrazí číslo , ale nedefinováno :
var a = 42 ; function foo () { alert ( typeof a ); // var a = 10; } foo ();Když je proměnná vytvořena, získává interní vlastnost {DontDelete} a nelze ji odstranit pomocí operátoru delete[Specification 10] . Výjimkou jsou proměnné deklarované v kontextu eval[12] [Specifikace 11] .
Mnoho zdrojů [13] [14] [15] [16] [17] [18] deklaruje možnost implicitně deklarovat proměnné v ECMAScriptu při přiřazení k platnému identifikátoru, který není formálním funkčním argumentem, bez předchozí deklarace pomocí var. V terminologii specifikace jazyka se však v tomto případě vytváří vlastnost globálního objektu, nikoli proměnná [12] [Specifikace 10] .
Oprava potřeby deklarovat proměnné před jejich použitím v kódovacím standardu [Coding Standards 1] [Coding Standards 4] (nebo opravení potřeby používat jmenné prostory pro všechny globální objekty [Coding Standards 2] ) zabraňuje jemným chybám a předchází nebezpečí interakce shodně pojmenovaných proměnných v různých částech kódu [19] .
Následující slova jsou klíčová slova v daném jazyce a nelze je použít jako identifikátory [Spec 12] :
break do instanceof typeof případ jiný nový var chytit konečně vrátit neplatné pokračujte pro přepnutí, zatímco funkce debuggeru default if throw pokus smazatVe srovnání s třetím vydáním specifikace [Specifikace 13] bylo v pátém vydání přidáno klíčové slovo debuggers odpovídající instrukcí.
Následující slova se používají jako klíčová slova v navrhovaných rozšířeních a jsou proto vyhrazena pro možnost přizpůsobení těchto rozšíření [Specifikace 14] :
class enum rozšiřuje super const export importPři použití přísného režimu jsou následující slova považována za vyhrazená pro budoucí použití [Spec 14] :
nářadí nechat soukromé veřejné výnosy balíček rozhraní chráněný staticOproti třetímu vydání jazykové specifikace se tak výrazně snížil počet slov vyhrazených pro budoucí použití. Dříve jich bylo 31 [Specifikace 15] a kritizována byla přítomnost velkého množství klíčových slov a vyhrazených slov, z nichž většina se v jazyce nepoužívá [20] .
ECMAScript má jak operátory , které používají klíčová slova jako jména , tak operátory , které používají jako jména interpunkční znaménka .
Klasifikace operátorůV sestupném pořadí podle priority lze operátory ECMAScript rozdělit do následujících skupin:
Operátory ++, --, -, +, ~, !, delete, typeof, void, ?:, =, *=, /=, +=, -=, <<=, >=, >>>=, &=jsou asociativní vpravo (to znamená ^=, |=že jsou a op b op cekvivalentní a op (b op c)). Zbývající operátory ECMAScript jsou ponechány asociativní [22] .
Podle arity jsou operátory ECMAScript rozděleny do následujících skupin:
Podle pozice znaménka operace vzhledem k operandům se operátory ECMAScript dělí do následujících skupin:
Operátoři jsou také klasifikováni podle typu operandů [25] a podle povahy prováděné akce.
Vlastnosti příkazů ECMAScriptV ECMAScriptu neexistuje žádný operátor, který by vám umožnil zkontrolovat, zda vlastnost patří přímo k objektu nebo zda je zděděna. Tato kontrola se provádí pomocí hasOwnProperty(). Vzhledem k tomu, že tato metoda není operátorem, lze ji přepsat jakoukoliv jinou vlastností [26] .
Operátor +je jediný aritmetický operátor v jazyce, který je přetížen řetězcovými argumenty. Pokud je alespoň jeden z operandů řetězec, +chová se jako zřetězovač , jinak provádí sčítání [27] [Specifikace 17] .
Na rozdíl od jazyků, kde void je datový typ, v ECMAScript je to operátor, který vrací hodnotu undefined[28] .
Operátor ==kontroluje rovnost podle algoritmu skládajícího se z 10 kroků, což v některých případech znamená konverzi typu [Specifikace 18] , která v konečném důsledku může vést k nezřejmým výsledkům [29] .
Příklad výsledků práce ==(ve všech uvedených případech bude hodnota operátoru ===se stejnými argumenty false):
upozornění ( "NaN" == NaN ); // falešný poplach ( NaN == NaN ); // falešné upozornění ( true == 1 ); // true alert ( true == 42 ); // falešné upozornění ( null == 0 ); // falešné upozornění ( 0 == "" ); // true alert ( "" == 0 ); // true alert ( "false" == false ); // falešné upozornění ( false == 0 ); // true alert ( undefined == false ); // falešné upozornění ( null == false ); // falešné upozornění ( undefined == null ); // true alert ( " \t\r\n " == 0 ); // skutečnýFunkce v ECMAScriptu jsou objekty [30] [31] . Konstruktor, pomocí kterého jsou vytvořeny, je Function(). Funkce, stejně jako jakékoli jiné objekty, mohou být uloženy v proměnných, objektech a polích, mohou být předány jako argumenty jiným funkcím a mohou být vráceny funkcemi. Funkce, stejně jako jakékoli jiné objekty, mohou mít vlastnosti. Podstatným specifikem funkcí je, že je lze volat [30] .
Definování funkcíV ECMAScriptu existují dva typy funkcí:
Interní funkce jsou vestavěné objekty (viz níže ), nemusí být nutně implementovány v ECMAScriptu [Specifikace 19] .
V textu programu lze pojmenovanou funkci v ECMAScript definovat jedním z následujících způsobů:
// deklarace funkce function sum ( arg1 , arg2 ) { return arg1 + arg2 ; } // definování funkce pomocí příkazu var sum2 = function ( arg1 , arg2 ) { return arg1 + arg2 ; }; // definování funkce pomocí zápisu objektu var sum3 = new Function ( "arg1" , "arg2" , "return arg1 + arg2;" );Poslední metoda je nejméně preferovaná, protože de facto jde o definování funkce pomocí výrazu, ale zároveň generuje dvojí interpretaci kódu (dodatečná interpretace nastává, když je kód předán konstruktoru), což může negativně ovlivnit výkon [31] .
První dvě metody poskytují podobný, ale ne identický účinek. Aby toho nebylo málo, příkaz použitý při definování funkce může vypadat velmi podobně jako deklarace funkce: za prvé za klíčovým slovem functionmůže následovat identifikátor [Specifikace 20] , za druhé středník může být vynechán kvůli mechanismu dokončování řetězce středníky [Specifikace 8] . Příklad:
// deklarace funkce function sum ( arg1 , arg2 ) { return arg1 + arg2 ; } // definování funkce pomocí výrazu var sum2 = function sum ( arg1 , arg2 ) { return arg1 + arg2 ; } funkční panel () { }; // použijte deklaraci funkce ( funkční lišta (){}) // použijte příslušnou instrukciNejvýznamnější rozdíl mezi definicí funkce pomocí deklarace a definicí funkce pomocí výrazu je v tom, že v prvním případě k vytvoření proměnné a jejímu přiřazení jako hodnoty funkce dochází před spuštěním kódu při vstupu do kontextu provádění. . Ve druhém případě proměnná obdrží hodnotu inicializátoru při provedení příkazu přiřazení. Když je proměnná vytvořena po vstupu do kontextu provádění, je inicializována hodnotou undefined[Spec 21] [32] (podrobnosti viz Deklarace proměnných ).
Příklad ilustrující rozdíl v pořadí provádění kódu:
upozornění ( součet ( 3 , 4 )); // 7: proměnná součtu již byla vytvořena v době provedení tohoto řádku a funkce sum ( arg1 , arg2 ) jí byla přiřazena function sum ( arg1 , arg2 ) { return arg1 + arg2 ; } výstraha ( součet2 ( 3 , 4 )); // chyba: proměnná suma2 již byla vytvořena v době provedení tohoto řádku, ale byla k ní přiřazena hodnota nedefinovaná var sum2 = function ( arg1 , arg2 ) { return arg1 + arg2 ; };Deklarace funkcí by neměly být používány uvnitř podmíněných konstrukcí [33] , i když prohlížeče Gecko to zvládnou intuitivně prostřednictvím implementovaného mechanismu funkcí jako instrukcí [34] .
Přiřazení funkcíProtože funkce v ECMAScriptu jsou objekty, to znamená, že jsou typu referenčních dat , identifikátory funkcí jsou proměnné, které ukládají odkaz na funkci. To lze ilustrovat následujícím kódem:
var sum = funkce ( arg1 , arg2 ) { return arg1 + arg2 ; }; upozornění ( součet ( 3 , 4 )); // 7 var suma2 = suma ; výstraha ( součet2 ( 4 , 2 )); // 6 suma = null ; výstraha ( součet2 ( 42 , 42 )); // 84Ve zvýrazněném řádku byste si měli dát pozor na absenci operátoru volání funkce ( ()) na pravé straně zadání. Pokud by v tomto řádku bylo místo sum uvedeno sum(), proměnné suma2 by nebyla přiřazena funkce, ale výsledek jejího volání. Další věc, která stojí za zmínku, je, že po přiřazení suma2 neukazuje na kopii funkce, ale právě na funkci, která ukazuje součet na .
Přetížení funkcíV ECMAScript není přetížení funkcí vlastností jazyka, ale jeho účinek je zajištěn pomocí jiných mechanismů.
Příklad ukazující absenci přetížení funkcí:
funkce suma ( arg1 , arg2 ) { return arg1 + arg2 ; } funkce součet ( arg1 , arg2 , arg3 ) { return arg1 + arg2 + arg3 ; } upozornění ( součet ( 3 , 4 )); // výstraha NaN ( suma ( 3 , 4 , 5 )); // 12Pokud je deklarováno více funkcí se stejným názvem, pozdější deklarace přepíší dřívější deklarace [31] .
Efekt přetížení funkcí je však dosažitelný.
1. Zkontrolujte, zda není definováno. Chcete-li zkontrolovat, zda byl funkci předán skutečný argument, můžete zkontrolovat formální argument identity na hodnotu undefined. Například:
funkce součet ( arg1 , arg2 , arg3 ) { if ( arg3 !== nedefinováno ) { return arg1 + arg2 + arg3 ; } else { return arg1 + arg2 ; } } upozornění ( součet ( 3 , 4 )); // 7 alert ( sum ( 3 , 4 , 5 )); // 122. Kontrola typu. Kromě toho lze použít typeof, instanceof, constructorke zjištění typu skutečných argumentů a přizpůsobení chování funkce v závislosti na nich.
function sum ( arg1 , arg2 , arg3 ) { switch ( typeof arg3 ) { case "undefined" : return arg1 + arg2 ; případ "číslo" : return arg1 + arg2 + arg3 ; výchozí : return arg1 + arg2 + " (" + arg3 + ")" ; } } upozornění ( součet ( 3 , 4 )); // 7 alert ( sum ( 3 , 4 , 5 )); // 12 alert ( sum ( 3 , 4 , "!" )); // "7 (!)"3. Přístup k datům o argumentech. Ve funkcích ECMAScript můžete přistupovat k datům argumentů pomocí objektu arguments[Specifikace 22] . Zejména vám umožňuje používat indexování pro přístup ke konkrétním předaným argumentům [31] [35] a vlastnosti length, která ukládá počet skutečně předaných argumentů, což může být užitečné při aplikaci obecného programovacího paradigmatu .
funkce suma () { var res = 0 ; for ( var i = 0 ; i < argumenty . délka ; i ++ ) { res += argumenty [ i ]; } return res ; } upozornění ( součet ( 3 , 4 )); // 7 alert ( sum ( 3 , 4 , 5 )); // 12 alert ( sum ( 3 , 4 , 5 , 7 , 9 )); // 28 RekurzeFunkce ECMAScript lze volat rekurzivně. Když definujete funkci pomocí příkazu bez uvedení identifikátoru za klíčovým slovem functionuvnitř funkce, můžete se na ni odkazovat pomocí vlastnosti callee objektu arguments[Specifikace 22] .
Příklad rekurzivního faktoriálového výpočtu:
var faktoriál = funkce ( krok , res ) { res = res || 1 ; if ( krok < 2 ) { return res ; } vrátit argumenty . volaný ( krok - 1 , krok * res ); }; výstraha ( faktoriál ( 5 )); // 120V současné době ECMAScript neimplementuje tail recursion , který se používá k optimalizaci rekurzivních volání [36] .
Zpětná voláníV ECMAScriptu je funkce objektem první třídy a lze ji předat jako argument jiné funkci. Pokud je současně volána ve funkci, které je předána, nazývá se funkce zpětného volání (nebo funkce zpětného volání ). Pokud předaná funkce nemá jméno, jedná se o anonymní funkci zpětného volání ( anonymní funkce zpětného volání ) [37] . Hlavní důvody pro použití funkcí zpětného volání jsou:
Příklad funkce, která vrací součet výsledků provedení předané funkce na argumentech:
function sumOfResults ( zpětné volání ) { var vysledek = 0 ; for ( var i = 1 ; i < argumenty . délka ; i ++ ) { výsledek += zpětné volání ( argumenty [ i ]); } vrátit výsledek ; } var square = funkce ( x ) { return x * x ; }; upozornění ( sumOfResults ( čtverec , 3 , 4 )); // 25 UzávěryFunkce v ECMAScript jsou ze své podstaty lexikálně vymezeny. To znamená, že rozsah je definován v okamžiku, kdy je funkce definována (na rozdíl od dynamického rozsahu, kde je rozsah definován v okamžiku volání funkce) [39] .
Když je funkce deklarována, sekvence vnořených rozsahů funkcí je uložena jako součást stavu funkce. To znamená, že během provádění programu si funkce, které mají přístup k lokálním proměnným uzavíracích funkcí, zachovávají takový přístup po celou dobu provádění programu [39] .
Uzavírací mechanismus lze použít k omezení viditelnosti proměnných v samostatné části programu, takže při sdílení s jiným kódem nedochází ke konfliktům názvů. Za tímto účelem je kód umístěn v anonymní funkci, která je vybavena operátorem volání funkce.
( funkce () { // Část programu, jejíž přístup k proměnným musí být izolován zvenčí. })();V tomto případě se funkce definované v části programu vnoří vzhledem k přidané anonymní funkci a je možné přistupovat k lokálním proměnným anonymní funkce (které byly před jejím zavedením globální). Nelze k nim však přistupovat zvenčí anonymní funkce: výsledek provedení funkce je ignorován.
Uzávěry se používají nejen k zákazu přístupu k řadě proměnných, ale také k úpravě takového přístupu. Toho je dosaženo pomocí funkcí, které vracejí jiné funkce. Příklad funkce generátoru sériových čísel:
var uniqueId = function () { var id = 0 ; return function () { return id ++ ; }; }(); var aValue = uniqueId (); var otherValue = uniqueId ();Při použití uzávěru má k proměnné id přístup pouze funkce, která byla přiřazena proměnné uniqueId .
Příklad kari :
var multNumber = function ( arg ) { return function ( mul ) { return arg * mul ; }; }; var multFive = multNumber ( 5 ); upozornění ( multiFive ( 7 )); //35Příklad vytvoření objektu, který vám umožní přistupovat k vlastnosti výhradně pomocí jejích metod [40] :
var myObject = function () { var value = 0 ; return { přírůstek : funkce ( vč ) { hodnota += typ vč === 'číslo' ? včetně : 1 ; }, getValue : function ( ) { return value ; } } }(); alert ( myObject . value === undefined ); // true alert ( myObject . getValue ()); // 0 myObject . přírůstek ( 9 ) myObject . increment ( 7 ) alert ( myObject . getValue ()); // 16Pomocí tohoto triku můžete použít uzávěr k emulaci konstant [41] .
var getConstant = function () { var konstanty = { UPPER_BOUND : 100 , LOWER_BOUND : - 100 }; return function ( konstantaName ) { return konstanty [ konstantaNazev ]; }; }(); upozornění ( getConstant ( "LOWER_BOUND" )); // -100Syntaxe a funkčnost regulárních výrazů v ECMAScriptu byla ovlivněna Perlem 5 [Spec 23] a umožňuje dva druhy syntaxe: literál a objekt .
var literalWay = /pattern/flags; var objectWay = new RegExp ( vzor , příznaky );V prvním případě jsou šablona ( pattern) a příznaky ( flags) specifikovány explicitně, bez dalších nadbytečných syntaktických znaků: lomítka slouží jako jejich oddělovače . Ve druhém případě musí být šablonou a příznaky proměnné obsahující řetězcové hodnoty nebo přímo řetězcové hodnoty. Doslovný zápis je preferován v tom, že nevyžaduje dvojité [~ 2] escapování metaznaků regulárního výrazu, na rozdíl od objektové formy [42] .
Následující symboly mohou být použity jako příznaky v ECMAScript:
Příznaky regulárního výrazu [42] [Spec 23]Vlajka | Popis |
---|---|
g | g globální režim: vzor se použije na všechny shody v řetězci, regulární výraz se nezastaví po nalezení první shody vzoru |
i | a malá a velká písmena - ignorování : při porovnávání jsou malá a velká písmena ve vzoru a řetězcích ignorována |
m | víceřádkový režim: s řádkem obsahujícím znaky nového řádku se zachází jako s několika řádky oddělenými znaky odřádkování; regex funguje na všech řádcích |
Každý regulární výraz je objekt s následujícími vlastnostmi:
Vlastnosti objektu regulárního výrazu ECMAScript [42] [Specifikace 23]Vlastnictví | Typ | Popis |
---|---|---|
global | logický | ukazuje, zda je nastaven příznakg |
ignoreCase | logický | ukazuje, zda je nastaven příznaki |
multiline | logický | ukazuje, zda je nastaven příznakm |
lastIndex | číselné | odpovídá číslu pozice v řetězci, kde byla nalezena shoda se vzorem v důsledku předchozí aplikace regulárního výrazu, nebo 0, pokud regulární výraz nebyl dříve aplikován |
source | tětiva | řetězec odpovídající vzoru regulárního výrazu |
Kromě toho jsou pro regulární výrazy definovány následující metody:
Objektové metody regulárního výrazu v ECMAScriptu [42] [Specifikace 23]Metoda | návratový typ | Popis |
---|---|---|
exec(handledString) | objekt (pole) popřnull | tvoří pole podřetězců , které odpovídají zadanému vzoru , přičemž bere v úvahu nastavené příznaky . pokud vzorunull neodpovídá žádný podřetězec |
test(handledString) | logický | truepokud existuje řetězec odpovídající vzoru a falsejinak |
Objekty ECMAScript jsou neuspořádané kolekce vlastností , z nichž každá má jeden nebo více atributů , které určují, jak lze vlastnost použít – například pokud je hodnota atributu ReadOnly nastavena na hodnotu true , pak jakýkoli pokus o změnu kódu pomocí kódu ECMAScript hodnota tohoto majetku selže. Vlastnosti jsou kontejnery , které zapouzdřují jiné objekty, hodnoty primitivních typů a metody [Specifikace 24] .
Atributy vlastnosti objektu ECMAScript [Spec 25]název | Popis |
---|---|
pouze ke čtení | Vlastnost je vlastnost pouze pro čtení. Pokus o změnu hodnoty této vlastnosti provedený v programu zůstane marný. V některých případech se hodnota vlastnosti se sadou atributů ReadOnly mění v důsledku akcí prostředí jazykového rozšíření, takže ReadOnly by nemělo být chápáno jako neměnné. |
DontEnum | Vlastnost není vyčíslena smyčkoufor-in |
DontDelete | Pokusy o odstranění této vlastnosti budou ignorovány. |
Vnitřní | Nemovitost je vnitřní. Nemá žádné jméno a nelze k němu přistupovat pomocí přístupových prvků . Přístup k těmto vlastnostem je určen implementací jazyka. |
Objekty ECMAScript se dělí na základní (nativní) a rozšiřující (hostitelské) objekty. Bází rozumíme jakékoli objekty, které jsou nezávislé na prostředí souvisejícím s rozšířením jazyka. Některé ze základních objektů jsou vestavěny : existují od samého začátku provádění programu. Jiné mohou být vytvořeny, když je program spuštěn. Objekty rozšíření poskytuje rozšíření ECMAScript a pro ECMAScript to znamená, že jsou součástí Document Object Model nebo Browser Object Model [Specifikace 3] .
SyntaxeObjektové a doslovné formy lze použít k určení objektů. Objektová forma specifikace objektu má syntaxi podobnou Javě, ale na rozdíl od ní se závorky v ECMAScriptu vyžadují pouze při předávání argumentů konstruktoru [43] . Následující položky jsou syntakticky ekvivalentní:
varobj1 = nový objekt ( ); var obj2 = nový objekt ; var obj3 = {};Druhá možnost se však nedoporučuje [43] . Douglas Crockford doporučuje vyhnout se i první možnosti a dát přednost doslovné formě, kterou považuje za velkou výhodu jazyka [44] .
Specifikace jazyka pracuje s konceptem vlastnosti objektu , volá metodu funkci použitou jako vlastnost objektu [Specifikace 3] .
Každý objekt v jazyce má následující vlastnosti:
Vlastnosti objektů ECMAScript [43]název | Stručný popis |
---|---|
constructor | Funkce použitá k vytvoření objektu (ve výše uvedených příkladech je to Object()) |
hasOwnProperty(propertyName) | Označuje, zda daná vlastnost existuje v objektu (nikoli v jeho prototypu ) |
isPrototypeOf(object) | Určuje, zda je objekt v řetězci prototypu objektu argumentu |
propertyIsEnumerable(propertyName) | Označuje, zda je vlastnost s daným názvem ve smyčce vyčíslitelnáfor-in |
toString() | Vrátí řetězcovou reprezentaci objektu |
hodnota() | Vrátí hodnotu this . Pokud je objekt výsledkem volání konstruktoru objektu rozšíření , je hodnota valueOf()závislá na implementaci [Spec 26] . Často je návratovou hodnotou hodnota primitivního typu odpovídající objektu. Výsledek této metody je zpravidla stejný jako výsledek toString(). Objekty vytvořené pomocí konstruktoru Date() jsou ukázkovým příkladem, kde se výsledky toString()a valueOf()neshodují [43] . |
Vlastnosti objektu jsou přístupné pomocí notace s tečkami a závorkami :
var obj = nový objekt (); alert ( obj . konstruktor === obj [ "konstruktor" ]); // true - pro přístup k vlastnosti použijte notaci s tečkami a závorkami var foo = obj [ "toString" ]; // pomocí zápisu hranatých závorek k uložení funkce do proměnné var result = obj [ "toString" ](); // uložení výsledku volání funkce do proměnné alert ( foo ()); // zobrazení výsledku volání uložené funkce na obrazovce alert ( result ); varboo = objekt _ _ toString ; // podobné s tečkovým zápisem var res = obj . toString (); výstraha ( boo ()); upozornění ( res );Nové vlastnosti lze nastavovat dynamicky.
varcountry = nový objekt ( ); země [ "jméno" ] = "Rusko" ; // použijte závorku země . založeníRok = 862 ; // použijte tečkovou notaci var country2 = { "jméno" : "Rusko" , "rok nadace" : 862 }; // použijte doslovný tvarVytváření objektů způsobem popsaným v předchozí části může být nepraktické kvůli nutnosti duplikovat kód [45] . Pokud program manipuluje s velkým množstvím objektů stejného typu, má vývojář možnost zvolit jednu z technik používaných v jazyce [45] :
továrna na předměty funkce, která vytvoří objekt a vrátí jej jako jeho hodnotu, konstruktér funkce, která používá klíčové slovo thisk vytvoření vlastností objektu, který vytváří pomocí operátoru new, prototypový přístup použití vlastnosti prototypefunkce k zobrazení obecných vlastností objektů, konstruktor-prototyp smíšeného přístupu použití konstruktoru k nastavení vlastností objektů, které nejsou metodami, a prototypový přístup k metodám nastavení, metoda dynamického prototypu uzavření kódu souvisejícího s funkcí vytváření objektů založených na smíšeném přístupu konstruktor-prototyp do jedné funkce, zajišťující, že vlastnosti prototypu jsou přiřazeny jednou, metoda parazitního konstruktoru použití news funkcí objektové továrny.V jazyce nejsou žádné třídy , ale lze je emulovat pomocí konstruktorů. Příklad emulace třídy v ECMAScript:
function MyClass () { this . mojeHodnota1 = 1 ; toto . mojeHodnota2 = 2 ; } Moje třída . prototyp . myMethod = function () { return this . myValue1 * toto . mojeHodnota2 ; } var mc = new MyClass (); mc _ mojeHodnota1 = mc . mojeHodnota2 * 2 ; var i = mc . mojeMetoda ();U každé ze složek objektu lze uvažovat o dědičnosti. Při dědění rozhraní rodiče, aniž by dítě využívalo funkcionalitu předka, se mluví o dědění rozhraní. Při dědění stavu dědí podřízený objekt datovou strukturu předchůdce. Při dědění funkčnosti mluvíme o dědičnosti spolu s rozhraním a kódem metod. Zpravidla to s sebou nese nutnost organizovat dědičnost státu, díky čemuž je rozumné kombinovat dědění státu a dědění funkčnosti do dědičnosti implementační [46] .
S ohledem na ECMAScript se neuplatňuje pouze dědičnost rozhraní, protože funkce v jazyce nemají podpisy [45] .
Možnosti, které jazyk poskytuje pro uspořádání dědictví, lze posoudit například podle seznamu dvanácti různých způsobů uspořádání dědictví , který uvádí Stoyan Stefanov [47] .
Přijetí ES6 odstranilo mnoho tříd problémů s JavaScriptem [48] [49] [50] [51] .
ECMAScript | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Dialekty |
| ||||||||||||
Motory ( srovnání ) |
| ||||||||||||
Rámce , knihovny |
| ||||||||||||
Lidé | |||||||||||||
jiný |
|
Ecma | Mezinárodní standardy|
---|---|
ISO | normy|
---|---|
| |
1 až 9999 |
|
10 000 až 19999 |
|
20 000+ | |
Viz také: Seznam článků, jejichž názvy začínají na „ISO“ |