ECMAScript | |
---|---|
Sprog klasse | Specifikation for programmeringssprog , funktionelt programmeringssprog og multiparadigme programmeringssprog |
Dukkede op i | juni 1997 |
Forfatter | Brendan Eich og Ecma International |
Udvikler | Brendan Eich |
Filtypenavn _ | .es[2] |
Frigøre | ECMAScript 2022 [Spec 1] (juni 2022 ) |
Type system | and |
Dialekter | JavaScript , JScript , ActionScript , JScript.NET , QtScript |
Blev påvirket | Self [1] , C , Scheme [1] , Perl [1] , Python , Java [1] , AWK [1] |
påvirket | Mål-J |
Internet side | ecma-international.org _ |
ECMAScript er et integreret, udvidbart, I/O -løst programmeringssprog, der bruges som grundlag for at bygge andre scriptsprog [3] .
ECMAScript er standardiseret af den internationale organisation ECMA i ECMA-262- specifikationen . Sprogudvidelser: JavaScript , JScript og ActionScript .
Sproget stammer fra flere teknologier, hvoraf de mest berømte er JavaScript- og JScript -sprogene . Udviklingen af den første revision af specifikationen begyndte i november 1996. Specifikationen blev vedtaget i juni 1997. Indsendt til ISO/IEC JTC 1 for Fast-Tracking- accept tjente det som grundlag for den internationale standard ISO/IEC 16262 . I juni 1998 vedtog ECMAs generalforsamling den anden udgave af ECMA-262, svarende til ISO/IEC 16262. Den tredje udgave af specifikationen adskilte sig fra den forrige ved at introducere understøttelse af regulære udtryk, forbedre strengunderstøttelse, introducere nye kontrolstrukturer , en undtagelsesmekanisme, formatering ved numerisk input og nogle andre ændringer[Specifikation 2] .
Fem primitive datatyper understøttes i ECMAScript :
Den numeriske datatype i ECMAScript svarer til 64-bit flydende talformatet defineret af IEEE 754-2008 standarden , bortset fra at de forskellige Not-a-Number værdier defineret i standarden [4] er repræsenteret på det sprog ved den enkelte specielle værdi NaN [ Specifikation 4] .
Nul og udefinerede datatyper omtales uformelt som "trivielle" typer af David Flanagan , da hver af dem kun definerer én værdi [5] .
Sproget har også en "sammensat" datatype [5] :
Ud over de seks anførte datatyper understøtter ECMAScript yderligere syv, der udelukkende bruges til at gemme mellemresultater af evaluerede udtryk:
Populariteten af JavaScript-sproget og ikke-trivialiteten ved at behandle data af forskellige typer førte til udbredelsen af akademisk forskning inden for parsing af ECMAScript-datatyper, som har til formål at skabe en fuldgyldig kodeanalysator, der kunne bruges i integreret udvikling miljøer [6] .
Der er femten forskellige slags instruktioner i ECMAScript, som er angivet i tabellen nedenfor:
Navn | oprindelige navn | Kort information | Finale ; [Specifikation 8] |
---|---|---|---|
Blok | engelsk blok | {[<instruktioner>]} | − |
Variabel erklæring | engelsk Variable Statement | var <liste over variabeldeklarationer> | + |
Tom instruktion | engelsk EmptyStatement | ; | + |
Udtryk | engelsk ExpressionStatement | [streng til ∉ {{, funktion}] sætning | + |
Tilstand | engelsk IfStatement | if (<инструкция>) <выражение>[ else <выражение>] | − |
Cyklus | engelsk Iteration Statement | lav <udtryk> mens (<udsagn>) mens (<udsagn>) <udtryk> |
+/− [~1] |
Fortsættelse | engelsk Fortsæt Statement | fortsæt [<identifikator>] | + |
Afbryde | engelsk BreakStatement | bryde [<identifikator>] | + |
Vend tilbage | engelsk Returerklæring | returner [<instruktion>] | + |
Kombination | engelsk WithStatement | med (<udsagn>) <udtryk> | − |
Etiket | engelsk Mærket Statement | <identifikator>: <udtryk> | − |
Valg | engelsk SwitchStatement | switch (<udsagn>) case <statement>: [<udtryk>][ case <statement>: [<udtryk>] ...] [standard: [<udtryk>]] | − |
At kaste en undtagelse | engelsk ThrowStatement | smid <instruktion> | + |
prøv at blokere | engelsk TryStatement | prøv <blok> catch (<identifikator>) <blok> prøv <blok> til sidst <blok> prøv <blok> catch (<identifikator>) <blok> til sidst <blok> |
− |
(ny [Spec 9] ) Debugger | engelsk Debugger | debugger | − |
På trods af det obligatoriske semikolon i de tilfælde, der er nævnt i fjerde kolonne, erklærer specifikationen en mekanisme til autofuldførelse af strenge med semikolon , hvilket fører til, at hvis der er et linjeskift, kan instruktionen før linjeskiftet udstyres med dette tegn [ Specifikation 8] , som er genstand for kritik [7] .
Instruktioner, der ændrer betydning, når du bruger en ny linje i [Specifikation 8]Et eksempel på at ændre betydningen af en instruktion
return { status : "complete" };Her indeholder den fremhævede linje en instruktion, der er gyldig af sproget, og da en ny linje følger, udløses mekanismen til autofuldførelse af linjer med semikolon. I stedet for at funktionen, der indeholder ovenstående kode, returnerer et objekt med egenskaben som værdi status, vil den returnere undefined.
Selvom den bogstavelige form af et objekt ikke er en kodeblok, kan ensartede parenteser føre til fejl. Udvikling eller vedtagelse af en passende kodningsstandard kan reducere sandsynligheden for, at de opstår . Valget af indrykningsstil spiller en rolle . Især Allman- og Whitesmith-stilene , såvel som Horstman -stilen og GNU-stilen til JavaScript-kode, er forældet af de fleste retningslinjer [8] i modsætning til K&R , 1TBS , BSD KNF -stilene .
AutofuldførelsesfejlHvis udtrykket skrevet på næste linje syntaktisk kan være en fortsættelse af udtrykket på den foregående linje, virker mekanismen til autofuldførelse af linjer med semikolon ikke [9] .
func () [ 'h1' , 'h2' ]. forHver ( funktion ( t ) { handleTag ( t ) })I dette eksempel fortolkes de firkantede parenteser på den anden linje som at henvise til et array-element returneret af func(). Kommaet i parentes behandles som den tilsvarende operator, der returnerer 'h2'. Så koden konverteres til følgende:
func ()[ 'h2' ]. forEach ( funktion ( t ) { handleTag ( t ); });Det er sædvanligt i kodningsstandarder at kræve semikolon, selvom sprogets syntaks tillader dem at blive udeladt [Coding Standards 1] [Coding Standards 2] [Coding Standards 3] [Coding Standards 4] [Coding Standards 5] .
Blokke og omfangEt andet træk ved ECMAScript i forhold til andre C-lignende sprog er, at i dette sprog danner blokke ikke et omfang . Variable deklarerede i en blok gælder for hele funktionen, der indeholder blokken [10] [11] .
I denne sektion af kode er variablen generklæret i de fremhævede linjer:
function foo ( ) { varsum = 0 ; for ( var i = 0 ; i < 42 ; i += 2 ) { var tmp = i + 2 ; sum += i * tmp ; } for ( var i = 1 ; i < 42 ; i += 2 ) { sum += i * i ; } advarsel ( tmp ); retursum ; _ } foo ();Derudover er variablen tmp erklæret inde i den første af sløjfene (linje 4) lovlig at få adgang til uden for sløjfen (linje 10) i henhold til sprogets syntaks.
På grund af arten af omfang og blokke anbefales det at deklarere variabler i begyndelsen af funktioner for at opretholde kildekodekvaliteten [10] [Kodningsstandarder 1] [Kodningsstandarder 4] .
Variable erklæringerVariabler defineres ved hjælp af nøgleord var, let, const. Når en variabel deklareres, placeres den i det omfang, der svarer til en varfunktion, og i tilfælde let, constaf en kodeblok. Hvis en variabel erklæres uden for funktioner, placeres den i det globale omfang. Oprettelse af en variabel sker, når kontrollen af funktionen med dens erklæring modtages. Eller et program, hvis variablen er global. Når en variabel oprettes i ECMAScript, får den værdien undefined. Hvis en variabel erklæres med initialisering , sker initialisering ikke i det øjeblik, variablen oprettes, men når linjen med instruktionen var[Specifikation 10] udføres .
Når du fjerner kommentarer til den valgte linje, viser skærmen ikke nummer , men udefineret :
var a = 42 ; function foo () { advarsel ( typeof a ); // var a = 10; } foo ();Når en variabel oprettes, erhverver den den interne egenskab {DontDelete} og kan ikke slettes ved hjælp af delete[Specifikation 10] -operatoren . Undtagelsen er variable erklæret i kontekst eval[12] [Specifikation 11] .
Mange kilder [13] [14] [15] [16] [17] [18] erklærer muligheden for implicit at erklære variable i ECMAScript, når der tildeles til en gyldig identifikator, der ikke er et formelt funktionsargument uden først at erklære med var. Men i sprogspecifikationens terminologi oprettes i dette tilfælde en egenskab for det globale objekt, ikke en variabel [12] [Specifikation 10] .
Ved at rette i kodningsstandarden behovet for at deklarere variabler, før de bruges [Coding Standards 1] [Coding Standards 4] (eller fikse behovet for at bruge navnerum for alle globale objekter [Coding Standards 2] ) undgår du subtile fejl, hvilket forhindrer faren for interaktion af identisk navngivne variable i forskellige dele af koden [19] .
Følgende ord er nøgleord på sproget og kan ikke bruges som identifikatorer [Spec 12] :
break do instans af typeof sag andet nyt var fange endelig returnere ugyldig fortsæt til skift mens debugger funktion dette med standard hvis kast slet i forsøgetSammenlignet med den tredje udgave af specifikationen [Specifikation 13] tilføjede den femte udgave et nøgleord debuggermed den tilsvarende instruktion.
Følgende ord bruges som nøgleord i foreslåede udvidelser og er derfor forbeholdt muligheden for at tilpasse disse udvidelser [Specifikation 14] :
klasse enum strækker sig super const eksport importNår du bruger streng tilstand, behandles følgende ord som reserveret til fremtidig brug [Spec 14] :
redskaber lade privat offentligt udbytte grænsefladepakke beskyttet statiskI forhold til tredje udgave af sprogspecifikationen er antallet af ord, der er reserveret til fremtidig brug, således faldet markant. Tidligere var der 31 [Specifikation 15] , og tilstedeværelsen af et stort antal søgeord og reserverede ord, hvoraf de fleste ikke bruges i sproget, blev kritiseret [20] .
ECMAScript har både operatorer, der bruger nøgleord som navne, og operatorer, der bruger tegnsætningstegn som navne .
Klassifikation af operatørerI faldende rækkefølge kan ECMAScript-operatorer opdeles i følgende grupper:
Operatorerne ++, --, -, +, ~, !, delete, typeof, void, ?:, , , , , , , , , , , , , , , , =, *=, /=, +=, -=, <<=, >=, >>>=, &=, ^=, er højreassociative |=(det vil sige, at de a op b op csvarer til a op (b op c)). De resterende ECMAScript-operatorer efterlades associative [22] .
Efter arity er ECMAScript-operatorer opdelt i følgende grupper:
I henhold til positionen af tegnet for operationen i forhold til operanderne er ECMAScript-operatorer opdelt i følgende grupper:
Operatører klassificeres også efter typen af operander [25] og arten af den udførte handling.
Funktioner i ECMAScript-sætningerDer er ingen operator i ECMAScript, der giver dig mulighed for at kontrollere, om en egenskab hører direkte til et objekt eller er nedarvet. Denne kontrol udføres ved hjælp af hasOwnProperty(). På grund af det faktum, at denne metode ikke er en operatør, kan den overskrives af enhver anden egenskab [26] .
Operator +er den eneste aritmetiske operator i sproget, der er overbelastet for strengargumenter. Hvis mindst en af operanderne er en streng, +fungerer den som en sammenkædning , ellers udfører den addition [27] [Specifikation 17] .
I modsætning til sprog, hvor void er en datatype, er det i ECMAScript en operator, der returnerer en værdi undefined[28] .
Operatøren ==kontrollerer for lighed i henhold til en algoritme bestående af 10 trin, hvilket i nogle tilfælde indebærer typekonvertering [Specifikation 18] , hvilket i sidste ende kan føre til ikke-oplagte resultater [29] .
Et eksempel på resultaterne af arbejdet ==(i alle de nævnte tilfælde vil værdien af operatøren ===med de samme argumenter være false):
alarm ( "NaN" == NaN ); // falsk advarsel ( NaN == NaN ); // falsk advarsel ( sand == 1 ); // true alarm ( sand == 42 ); // falsk advarsel ( null == 0 ); // falsk advarsel ( 0 == "" ); // true advarsel ( "" == 0 ); // true advarsel ( "false" == falsk ); // falsk advarsel ( falsk == 0 ); // true advarsel ( udefineret == falsk ); // falsk advarsel ( null == falsk ); // falsk advarsel ( udefineret == null ); // true advarsel ( " \t\r\n " == 0 ); // rigtigtFunktioner i ECMAScript er objekter [30] [31] . Konstruktøren, som de er oprettet med, er Function(). Funktioner, som alle andre objekter, kan lagres i variabler, objekter og arrays, kan overføres som argumenter til andre funktioner og kan returneres af funktioner. Funktioner, som alle andre objekter, kan have egenskaber. Et væsentligt specifikt træk ved funktioner er, at de kan kaldes [30] .
Definere funktionerDer er to typer funktioner i ECMAScript:
Interne funktioner er indbyggede objekter (se nedenfor ), ikke nødvendigvis implementeret i ECMAScript [Specifikation 19] .
I programmets tekst kan en navngivet funktion i ECMAScript defineres på en af følgende måder:
// funktionserklæring funktion sum ( arg1 , arg2 ) { return arg1 + arg2 ; } // definere en funktion ved hjælp af en sætning var sum2 = function ( arg1 , arg2 ) { return arg1 + arg2 ; }; // definere en funktion ved hjælp af objektnotation var sum3 = new Function ( "arg1" , "arg2" , "return arg1 + arg2;" );Sidstnævnte metode er den mindst foretrukne, da det de facto handler om at definere en funktion ved hjælp af et udtryk, men samtidig genererer den en dobbeltfortolkning af koden (en yderligere fortolkning sker, når koden sendes til konstruktøren), hvilket kan påvirke ydeevnen negativt [31] .
De to første metoder giver en lignende, men ikke identisk effekt. For at gøre ondt værre kan den sætning, der bruges, når en funktion defineres, ligne en funktionsdeklaration: For det første kan nøgleordet functionefterfølges af en identifikator [Specifikation 20] , for det andet kan semikolon udelades på grund af strengfuldførelsesmekanismen semikolon [Specifikation 8] . Eksempel:
// funktionserklæring funktion sum ( arg1 , arg2 ) { return arg1 + arg2 ; } // definere en funktion ved hjælp af et udtryk var sum2 = funktion sum ( arg1 , arg2 ) { return arg1 + arg2 ; } funktionslinje () { }; // brug funktionserklæringen ( funktionslinje ( ){}) // brug den relevante instruktionDen væsentligste forskel mellem at definere en funktion ved hjælp af en erklæring og at definere en funktion ved hjælp af et udtryk er, at i førstnævnte tilfælde sker oprettelsen af en variabel og dens tildeling som værdien af funktionen, før koden udføres, når man går ind i udførelseskonteksten . I det andet tilfælde modtager variablen værdien af initializeren, når tildelingssætningen udføres. Når en variabel oprettes ved indtræden i en eksekveringskontekst, initialiseres den med værdien undefined[Spec 21] [32] (se Variable Declarations for detaljer ).
Et eksempel, der illustrerer forskellen i kodeudførelsesrækkefølge:
alarm ( sum ( 3 , 4 )); // 7: sumvariablen er allerede blevet oprettet på det tidspunkt, hvor denne linje udføres, og funktionen sum ( arg1 , arg2 ) er blevet tildelt den funktion sum ( arg1 , arg2 ) { return arg1 + arg2 ; } alarm ( sum2 ( 3 , 4 )); // fejl: variabel sum2 er allerede blevet oprettet på det tidspunkt, hvor denne linje udføres, men undefined er blevet tildelt den var sum2 = function ( arg1 , arg2 ) { return arg1 + arg2 ; };Funktionserklæringer bør ikke bruges i betingede konstruktioner [33] , selvom Gecko-browsere vil håndtere dette intuitivt gennem den implementerede mekanisme af funktioner som instruktioner [34] .
FunktionstildelingerDa funktioner i ECMAScript er objekter, dvs. de er af en referencedatatype , er funktionsidentifikatorer variabler, der gemmer en reference til funktionen. Dette kan illustreres med følgende kode:
var sum = function ( arg1 , arg2 ) { return arg1 + arg2 ; }; alarm ( sum ( 3 , 4 )); // 7 var sum2 = sum ; alarm ( sum2 ( 4 , 2 )); // 6 sum = null ; alarm ( sum2 ( 42 , 42 )); // 84I den fremhævede linje skal du være opmærksom på fraværet af funktionsopkaldsoperatøren ( ()) i højre side af opgaven. Hvis i stedet for sum blev angivet i denne linje sum(), ville variablen sum2 ikke blive tildelt en funktion, men resultatet af dens kald. En anden ting, der er værd at bemærke, er, at sum2 efter tildeling ikke peger på en kopi af funktionen, men på netop den funktion, som sum peger på .
Funktion overbelastningI ECMAScript er funktionsoverbelastning ikke en egenskab ved sproget, men dets effekt opnås ved brug af andre mekanismer.
Et eksempel, der viser fraværet af funktionsoverbelastning:
function sum ( arg1 , arg2 ) { return arg1 + arg2 ; } function sum ( arg1 , arg2 , arg3 ) { return arg1 + arg2 + arg3 ; } alarm ( sum ( 3 , 4 )); // NaN- advarsel ( sum ( 3 , 4 , 5 )); // 12Hvis flere funktioner med samme navn erklæres, overskriver senere erklæringer tidligere erklæringer [31] .
Effekten af funktionsoverbelastning er dog opnåelig.
1. Tjek for udefineret. For at kontrollere, om det faktiske argument blev overført til funktionen, kan du kontrollere det formelle argument for identitet til værdien af undefined. For eksempel:
function sum ( arg1 , arg2 , arg3 ) { if ( arg3 !== udefineret ) { return arg1 + arg2 + arg3 ; } else { return arg1 + arg2 ; } } alarm ( sum ( 3 , 4 )); // 7 alarm ( sum ( 3 , 4 , 5 )); // 122. Skriv check. Derudover kan typeof, instanceof, constructorbruges til at finde ud af typen af faktiske argumenter og tilpasse funktionsadfærden afhængigt af dem.
function sum ( arg1 , arg2 , arg3 ) { switch ( typeof arg3 ) { case "undefined" : returner arg1 + arg2 ; case "nummer" : returner arg1 + arg2 + arg3 ; standard : returner arg1 + arg2 + " (" + arg3 + ")" ; } } alarm ( sum ( 3 , 4 )); // 7 alarm ( sum ( 3 , 4 , 5 )); // 12 alarm ( sum ( 3 , 4 , "!" )); // "7(!)"3. Adgang til data om argumenter. I ECMAScript-funktioner kan du få adgang til argumentdata ved hjælp af arguments[Specifikation 22] -objektet . Især giver det dig mulighed for at bruge indeksering til at få adgang til specifikke argumenter, der er bestået [31] [35] og en egenskab length, der gemmer antallet af argumenter, der faktisk er bestået, hvilket kan være nyttigt, når du anvender det generiske programmeringsparadigme .
funktion sum () { var res = 0 ; for ( var i = 0 ; i < argumenter . længde ; i ++ ) { res += argumenter [ i ]; } returnere res ; } alarm ( sum ( 3 , 4 )); // 7 alarm ( sum ( 3 , 4 , 5 )); // 12 alarm ( sum ( 3 , 4 , 5 , 7 , 9 )); // 28 RekursionECMAScript-funktioner kan kaldes rekursivt. Når du definerer en funktion ved hjælp af en sætning uden at angive en identifikator efter nøgleordet functioninde i funktionen, kan du henvise til den ved at bruge callee-egenskaben for arguments[Specifikation 22] -objektet .
Et eksempel på rekursiv faktorberegning:
var factorial = funktion ( trin , res ) { res = res || 1 ; if ( trin < 2 ) { return res ; } returner argumenter . kaldet ( trin - 1 , trin * res ); }; alarm ( faktoriel ( 5 )); // 120I øjeblikket implementerer ECMAScript ikke hale-rekursion , som bruges til at optimere rekursive opkald [36] .
TilbagekaldI ECMAScript er en funktion et førsteklasses objekt og kan overføres som et argument til en anden funktion. Hvis det samtidig kaldes i den funktion, som det sendes til, så kaldes det en tilbagekaldsfunktion (eller tilbagekaldsfunktion ). Hvis den beståede funktion ikke har et navn, er det en anonym tilbagekaldsfunktion ( anonym tilbagekaldsfunktion ) [37] . De vigtigste grunde til at bruge tilbagekaldsfunktioner er:
Et eksempel på en funktion, der returnerer summen af resultaterne af udførelse af den beståede funktion på argumenterne:
function sumOfResults ( tilbagekald ) { var result = 0 ; for ( var i = 1 ; i < argumenter . længde ; i ++ ) { resultat += tilbagekald ( argumenter [ i ]); } returner resultat ; } var square = function ( x ) { return x * x ; }; advarsel ( sumOfResults ( firkantet , 3 , 4 )); // 25 LukningerFunktioner i ECMAScript er i sagens natur leksikalsk scoped. Det betyder, at omfanget er defineret på det tidspunkt, hvor funktionen er defineret (i modsætning til dynamisk omfang, hvor omfanget er defineret på det tidspunkt, hvor funktionen kaldes) [39] .
Når en funktion erklæres, gemmes sekvensen af indlejrede funktionsomfang som en del af funktionens tilstand. Det vil sige, at under programafvikling bevarer funktioner, der har adgang til lokale variabler for omsluttende funktioner, sådan adgang under hele programmets afvikling [39] .
Lukkemekanismen kan bruges til at begrænse synligheden af variabler i en selvstændig sektion af programmet, så der ikke er navnekonflikter, når de deles med anden kode. For at gøre dette placeres koden i en anonym funktion, forsynet med en funktionsopkaldsoperatør.
( funktion () { // Afsnit af programmet, hvis adgang til variabler skal isoleres udefra. })();I dette tilfælde bliver funktionerne defineret i programafsnittet indlejret i forhold til den tilføjede anonyme funktion, og det er muligt at få adgang til de lokale variabler for den anonyme funktion (som var globale før dens introduktion). De kan dog ikke tilgås uden for den anonyme funktion: Resultatet af funktionsudførelsen ignoreres.
Lukninger bruges ikke kun til at forbyde adgang til en række variabler, men også til at ændre sådan adgang. Dette opnås med funktioner, der returnerer andre funktioner. Et eksempel på en serienummergeneratorfunktion:
var unikt id = funktion () { var id = 0 ; return funktion () { return id ++ ; }; }(); var aValue = unikt id (); var anotherValue = unikt id ();Ved at bruge en lukning er det kun den funktion, der blev tildelt til variablen uniqueId , der har adgang til id -variablen .
Karry eksempel :
var multNumber = funktion ( arg ) { return funktion ( mul ) { return arg * mul ; }; }; var multFive = multNumber ( 5 ); alarm ( multFive ( 7 )); //35Et eksempel på oprettelse af et objekt, der giver dig adgang til ejendommen udelukkende ved hjælp af dets metoder [40] :
var mitObjekt = funktion () { var værdi = 0 ; return { increment : function ( inc ) { value += typeof inc === 'tal' ? ink : 1 ; }, getValue : function ( ) { return value ; } } }(); advarsel ( myObject . værdi === udefineret ); // true alert ( myObject . getValue ()); // 0 mitObjekt . forøg ( 9 ) mitObject . inkrement ( 7 ) advarsel ( myObject . getValue ()); // 16Ved at bruge dette trick kan du bruge en lukning til at efterligne konstanter [41] .
var getConstant = function () { var constants = { UPPER_BOUND : 100 , LOWER_BOUND : - 100 }; returner funktion ( konstantnavn ) { returner konstanter [ konstantnavn ]; }; }(); advarsel ( getConstant ( "LOWER_BOUND" )); // -100Syntaksen og funktionaliteten af regulære udtryk i ECMAScript blev påvirket af Perl 5 [Spec 23] og tillader to slags syntaks: literal og object .
var literalWay = /mønster/flag; var objectWay = new RegExp ( mønster , flag );I det første tilfælde er skabelonen ( pattern) og flagene ( flags) specificeret eksplicit uden yderligere redundante syntaktiske tegn: skråstreger tjener som deres separatorer . I det andet tilfælde skal skabelonen og flagene være variable, der indeholder strengværdier, eller direkte strengværdier. Den bogstavelige notation foretrækkes, fordi den ikke kræver dobbelt [~ 2] escape af regulære udtryks metategn, i modsætning til objektformen [42] .
Følgende symboler kan bruges som flag i ECMAScript:
Flag | Beskrivelse |
---|---|
g | g global tilstand: mønsteret anvendes på alle matches i strengen, det regulære udtryk stopper ikke efter det første match af mønsteret er fundet |
i | og store og små bogstaver - ignorering : Når der matches, ignoreres store og små bogstaver i mønstertegnene og strengene |
m | multi -line mode: en linje, der indeholder nye linjetegn , behandles som flere linjer adskilt af linefeed-tegn; regex virker på alle linjer |
Hvert regulært udtryk er et objekt med følgende egenskaber:
Ejendom | Type | Beskrivelse |
---|---|---|
global | logisk | viser om flaget er satg |
ignoreCase | logisk | viser om flaget er sati |
multiline | logisk | viser om flaget er satm |
lastIndex | numerisk | matcher positionsnummeret i strengen, hvor mønstermatchet blev fundet som et resultat af den tidligere anvendelse af det regulære udtryk, eller 0, hvis det regulære udtryk ikke tidligere blev anvendt |
source | snor | streng, der matcher det regulære udtryksmønster |
Derudover er følgende metoder defineret for regulære udtryk:
Metode | returtype | Beskrivelse |
---|---|---|
exec(handledString) | objekt (array) ellernull | danner et array af understrenge, der matcher det angivne mønster , under hensyntagen til de indstillede flag . nullhvis ingen understreng matcher mønsteret |
test(handledString) | logisk | truehvis der er en snor der matcher mønsteret og falseandet |
ECMAScript-objekter er uordnede samlinger af egenskaber , som hver har en eller flere attributter , der bestemmer, hvordan egenskaben kan bruges - hvis værdien af ReadOnly-attributten f.eks. er sat til sand , vil ethvert forsøg ved at udføre ECMAScript-kode ændre værdien af den ejendom vil fejle. . Egenskaber er beholdere , der indkapsler andre objekter, værdier af primitive typer og metoder [Specifikation 24] .
Navn | Beskrivelse |
---|---|
Læs kun | Ejendommen er en skrivebeskyttet ejendom. Et forsøg på at ændre værdien af denne ejendom, lavet i programmet, vil forblive forgæves. I nogle tilfælde ændres værdien af en egenskab med ReadOnly-attributsættet på grund af handlingerne i sprogudvidelsesmiljøet, så ReadOnly skal ikke forstås som uforanderlig. |
DontEnum | Egenskaben er ikke opregnet efter sløjfefor-in |
Slet ikke | Forsøg på at fjerne denne egenskab vil blive ignoreret. |
Indre | Ejendommen er intern. Den har intet navn og kan ikke tilgås med accessorer . Adgang til disse egenskaber bestemmes af sprogimplementeringen. |
ECMAScript-objekter er opdelt i grundlæggende (native) og udvidelses- (værts) objekter. Med base mener vi alle objekter, der er uafhængige af miljøet relateret til udvidelsen af sproget. Nogle af de grundlæggende objekter er indbygget : eksisterer lige fra starten af programmets udførelse. Andre kan blive oprettet, når programmet kører. Udvidelsesobjekter leveres af ECMAScript-udvidelsen, og for ECMAScript betyder det, at de er en del af Document Object Model eller Browser Object Model [Specifikation 3] .
SyntaksObjekt og bogstavelige former kan bruges til at specificere objekter. Objektformen til at specificere et objekt har en syntaks, der ligner Java, men i modsætning til den skal parenteser i ECMAScript kun bruges, når argumenter sendes til en konstruktør [43] . Følgende poster er syntaktisk ækvivalente:
varobj1 = nyt objekt ( ); var obj2 = nyt objekt ; var obj3 = {};Den anden mulighed anbefales dog ikke [43] . Douglas Crockford anbefaler også at undgå den første mulighed, idet han foretrækker den bogstavelige form, som han anser for at være en stor fordel ved sproget [44] .
Sprogspecifikationen opererer med begrebet et objekts egenskab , og kalder en metode for en funktion, der bruges som en egenskab for et objekt [Specifikation 3] .
Hvert objekt i sproget har følgende egenskaber:
Navn | Kort beskrivelse |
---|---|
constructor | Funktionen, der bruges til at oprette objektet (i eksemplerne ovenfor er det Object()) |
hasOwnProperty(ejendomsnavn) | Angiver om den givne egenskab findes i objektet (ikke i dets prototype ) |
erPrototypeOf(objekt) | Bestemmer om et objekt er i argumentobjektets prototypekæde |
propertyIsEnumerable(ejendomsnavn) | Angiver om egenskaben med det angivne navn er talbar i løkkenfor-in |
toString() | Returnerer strengrepræsentationen af objektet |
Værdi af() | Returnerer denne værdi . Hvis objektet er resultatet af et kald til et udvidelsesobjekts konstruktør , er værdien valueOf()implementeringsafhængig [Spec 26] . Ofte er returværdien en primitiv typeværdi, der svarer til et objekt. Som regel er resultatet af denne metode det samme som resultatet af toString(). Objekter oprettet med en konstruktør Date() er et godt eksempel, hvor resultaterne af toString()og valueOf()ikke matcher [43] . |
Objektegenskaber tilgås ved hjælp af punkt- og parentesnotation :
var obj = nyt objekt (); advarsel ( obj . constructor === obj [ "constructor" ]); // sand - brug punkt- og parentesnotation for at få adgang til egenskaben var foo = obj [ "toString" ]; // bruger parentesnotation til at gemme funktionen i en variabel var result = obj [ "toString" ](); // gemmer resultatet af funktionskaldet til en variabel advarsel ( foo ()); // visning af resultatet af at kalde den lagrede funktion på skærmen advarsel ( resultat ); varboo = obj . _ toString ; // lignende med punktnotation var res = obj . toString (); advarsel ( bøh ()); alarm ( res );Nye egenskaber kan indstilles dynamisk.
varcountry = nyt objekt ( ); country [ "name" ] = "Rusland" ; // brug parentes notation land . grundår = 862 ; // brug punktnotation var country2 = { "name" : "Rusland" , "foundationYear" : 862 }; // brug bogstavelig formOprettelse af objekter på den måde, der er beskrevet i det foregående afsnit, kan være upraktisk på grund af behovet for at duplikere kode [45] . Hvis programmet manipulerer et stort antal objekter af samme type, har udvikleren mulighed for at vælge en af de teknikker, der bruges i sproget [45] :
genstandsfabrik en funktion, der skaber et objekt og returnerer det som dets værdi, konstruktør en funktion, der bruger nøgleordet thistil at danne egenskaberne for det objekt, det opretter ved hjælp af operatoren new, prototype tilgang bruge egenskaben prototypeaf en funktion til at vise objekters generelle egenskaber, blandet tilgang konstruktør-prototype brug af en konstruktør til at indstille egenskaber for objekter, der ikke er metoder, og en prototypetilgang til sæt metoder, dynamisk prototype metode at konkludere koden relateret til funktionen med at skabe objekter baseret på den blandede konstruktør-prototype tilgang til én funktion, hvilket sikrer, at prototypeegenskaber tildeles én gang, parasitisk konstruktørmetode brug newmed objektfabriksfunktion.Der er ingen klasser i sproget , men de kan emuleres ved hjælp af konstruktører. Et eksempel på klasseemulering i ECMAScript:
function MyClass () { this . minVærdi1 = 1 ; dette . minVærdi2 = 2 ; } Min klasse . prototype . myMethod = function () { returner dette . minVærdi1 * dette . minVærdi2 ; } var mc = new MyClass (); mc . minVærdi1 = mc . minVærdi2 * 2 ; var i = mc . minmetode ();For hver af objektets komponenter kan arv overvejes. Når man arver grænsefladen til en forælder uden at barnet bruger forfaderens funktionalitet, taler man om nedarvning af grænsefladen. Når det nedarves tilstand, arver det underordnede objekt datastrukturen for det forfaderlige objekt. Når vi nedarver funktionalitet, taler vi om arv sammen med grænsefladen og metodekoden. Dette medfører som udgangspunkt behov for at organisere statsarv, hvilket gør det rimeligt at kombinere statsarv og funktionsarv til gennemførelsesarv [46] .
Med hensyn til ECMAScript gælder kun grænsefladearv ikke, da funktioner i sproget ikke har signaturer [45] .
De muligheder, sproget giver for organisering af arv, kan f.eks. bedømmes ud fra den liste, som Stoyan Stefanov [47] har givet over tolv forskellige måder at organisere arv på.
Vedtagelsen af ES6 har elimineret mange klasser af JavaScript-problemer [48] [49] [50] [51] .
ECMAScript | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Dialekter |
| ||||||||||||
Motorer ( sammenligning ) | |||||||||||||
Rammer , biblioteker |
| ||||||||||||
Mennesker | |||||||||||||
Andet |
|
Ecma internationale standarder | |
---|---|
ISO standarder | |
---|---|
| |
1 til 9999 |
|
10000 til 19999 |
|
20000+ | |
Se også: Liste over artikler, hvis titler begynder med "ISO" |