ECMAScript
Jaak Ristioja
nelipühakuu 22. päeval
Anno Domini 2007
Ajalugu
- Algselt arendatud Brendan Eich (Netscape) poolt veebi skriptimiskeelena
- Esialgselt nimega Mocha, LiveScript, lõpuks Javascript
- Märts 1996: JavaScript 1.0 (Netscape 2.0)
- August 1996: JScript 1.0 (Internet Explorer 3.0)
- Juuni 1997: ECMA-262 1st edition
- Juuni 1998: ECMA-262 2nd edition
- Detsember 1999: ECMA-262 3rd edition
- Hilisemad JavaScript ja JScript versioonid põhinevad ECMAScriptil
Ülevaade
- Arvutuste tegemiseks ja manipuleerimiseks keskkonna arvutuslike objektidega
- Algselt veebiprogrammeerimiseks (skriptimiseks)
- Mitte väga range, pidades meeles ka mitteprofessionaalseid programmeerijaid
- Puuduvad standardsed vahendid sisendiks ja väljundiks
- Mitu programmeerimisparadigma
- Objekt-orienteeritud
- Prototüüp-orienteeritud
Tüüpimisest
- Dünaamiliselt tüübitud
- Duck typing
- "when I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck." - James Whitcomb Riley (Ameerika kirjanik ja luuletaja 1849-1916)
Tüübid
- Undefined (undefined)
- Null (null)
- Boolean (true, false)
- Number
- String
- Object
Number
- topelttäpsusega 64-bitised (IEEE 754) väärtused
- täpselt 18 437 736 874 454 810 627 (~18 kvintiljonit ehk 18×1018) ujukomaarvu
- Kõikide IEEE 9 007 199 254 740 990 (~9 kvadriljoni) "Not-a-Number" NaN väärtuse asemel on ainult üks NaN
- Positiivne ja negatiivne lõpmatus (Infinity, -Infinity)
- ülejäänud 18 437 736 874 454 810 624 arvu hulgas leidub igale arvule vastandarv
- seega leidub ka 0 ja -0
String
- lõplik järjestatud 16-bitiste märgita täisarvude(unsigned integer) jada.
- "Näidissõne 'String'"
- 'Näidissõne "String"'
- \' \" \\ \b \f \n \r \t \v
- \xFF (märgi kood)
- \uFFFF (Unicode koodipunkt)
- Ei tohi sisaldada ühtegi reavahetusmärki va \uFFFF ja \xFF abil
Object
- Sorteerimata väljade (properties) kogum
- Väli hoiab teist objekti, fundamentaalväärtust või meetodit
- Väli võib omada 0 või enam sisemist (mitte keele põhist) atribuuti
- Atribuut määrab kuidas välja saab kasutada
- ReadOnly (kirjutuskaitse)
- DontEnum (ignoreeritakse for-in tsüklis)
- DontDelete (ei lubata kustutada delete abil)
Lähtekood (1)
- UTF-16 (normaliseeritud C-vorm)
- Lubatud on mitte-ladina tähemärgid identifikaatorites, sõnedes, regulaaravaldistes ja kommentaarides
- Lubatud on kasutada lähtekoodis \uFFFF süntaksit
- kommentaarides seda ignoreeritakse
Lähtekood (2)
- Tühiruumiks (whitespace) on kõik Unicode'is defineeritud vastavad märgid
- Unicode' vormingukontrolli märgendeid (näiteks RIGHT-TO-LEFT MARK, ühendamismärgendeid jne) parserile ei söödeta
- Et neid sõnedes kirjeldada, saab kasutada \uFFFF süntaksit
Kommentaarid
- // kommentaar, mis kestab rea lõpuni
- /* selline kommentaar
võib jätkuda
üle mitme rea*/
25+3 võtmesõna
- break case catch continue default delete do else finally for function if in instanceof new return switch this throw try typeof var void while with
- null
- true ja false
31 tuleviku tarbeks reserveeritud sõna
abstract boolean byte char class const debugger double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile
Identifikaatorid (1)
- vastavalt Unicode 3.0 standardi sektsioonile 5.16
- peab algama tähe või ideograafiga (hieroglüüfid jms)
- võib sisaldada tähti, ideograafe, numbreid, ühendavaid märke (side- ja alakriipsud) ja vormingumärgendeid (kuid neid ignoreeritakse parsimisel).
Identifikaatorid (2)
- võivad sisaldada dollari märki ($), mis on mõeldud eelkõige kasutamiseks mehaaniliselt genereeritud koodi jaoks)
- \uFFFF (va eelpool nimetamata märgendite jaoks)
Kasutatud sümbolid ja operaatorid
{ } ( ) [ ] . ; , < > <= >= == != === !== + - * % / ++ -- << >> >>> ~ & | ^ ! && || ?: = += -= *= %= /= <<= >>= >>>= &= |= ^=
Blokk- ja tühidirektiiv
- Blokkdirektiiv
- Nagu C's, grupeerib direktiive.
- { direktiiv1; direktiiv2; ... }
- Lubatud on ka tühi blokk { }
- Ei defineeri uut skoopi muutujate jaoks
- Lubatud on ka tühidirektiiv ;
Muutujate (väljade) deklareerimine
- var a;
- var a = 12;
- var a, b;
- var a = 12, b = 13;
Tingimusdirektiivid
- if (tingimus) teeSeda;
- if (tingimus) direktiiv1 else direktiiv2;
- switch (avaldis) {
case 10: break;
case "test":
case true:
teeSeda;
break;
default: teeToda;
}
- avaldis ? kuiTõene : kuiVäär
Tsüklidirektiivid (1)
- do direktiiv while (tingimus);
- while (tingimus) direktiiv;
- for (avaldis; tingimused; samm) direktiiv
- for (var deklaratsioonid; tingimused; samm) direktiiv
- for (avaldis in avaldis2) direktiiv
- for (var deklaratsioon in avaldis2) direktiiv
Tsüklidirektiivid (2)
- break;
- break märgend;
- continue;
- continue märgend;
- välimine: for (var i = 0; i < 10; i++)
for (var j = 0; j < 10; j++)
if (avaldis) continue välimine;
Erindidirektiivid
- throw avaldis;
- try {...} catch (identifikaator) {...}
- try {...} finally {...}
- try {...} catch (identifikaator) {...} finally {...}
Funktsioonid
- function äraTeeMidagi() { }
- function äraTeeMidagi() { return; }
- function teeJaTagastaMidagi(a, b, c) {
a *= c;
return a + b;
}
Konstruktorid
- function A(väärtus) {
this.ba = väärtus;
this.meetod = function(a) {
return this.ba + a;
}
return this;
}
var a = new A(12);
var b = a.meetod(5);
var c = a["b" + "a"];
with
- function A(väärtus) {
this.ba = väärtus;
this.meetod = function(a) {
return this.ba + a;
}
return this;
}
var a = new A(12);
with (a) { ba = meetod(2); }
Sisemine viite tüüp (Reference)
- Tegu pole keele tüübiga
- Viitab objekti väljale
- Koosneb kahest osast:
- delete objekt.väli;
void, typeof, instanceof, in
- void avaldis;
- var a;
typeof a; // "undefined"
- a instanceof A
- Tagastab, kas etteantud väärtus delegeerib käitumise antud objektile
- ba in a
- Tagastab, kas etteantud objektil on väli antud nimega
Globaalne objekt (1)
- Temast ei saa luua instantse
- Väljad:
- NaN väärtusega NaN {DontEnum, DontDelete}
- Infinity väärtusega Infinity {DontEnum, DontDelete}
- undefined väärtusega undefined {DontEnum, DontDelete}
Globaalne objekt (2)
- Meetodid:
- eval(x)
- parseInt(sõne, baas)
- parseFloat(sõne)
- isNaN(number)
- isFinite(number)
- false, kui number on ka NaN
- encodeURI(uri)
- decodeURI(uri)
- decodeURIComponent(uri)
- encodeURIComponent(uri)
Globaalne objekt (3)
- Konstruktoritest meetodid:
- Object(...), Function(...), Array(...), String(...), Boolean(...), Number(...), Date(...), RegExp(...), Error(...), EvalError(...), RangeError(...), ReferenceError(...), SyntaxError(...), TypeError(...), URIError(...)
- Muud väljad:
Prototüübid
- Igal objektil võib olla prototüüp (väli .prototype), mis viitab mõnele teisele objektile
- Kui püütakse kasutada objekti välja, mida objektil pole, otsitakse seda prototüübilt.
- Üks objekt võib olla mitme teise objekti prototüübiks.
- Prototüüpide ahel peab olema lõplik.
- Selle ahela viimase objekti prototype välja väärtus on null
- Objektide prototüübi muutmine muudab nende käitumist.
Objekt Object
- { väli: väärtus, väli2: { väli: väärtus}}
- new Object([väärtus])
- .prototype
- .constructor
- .toString()
- .toLocaleString()
- .valueOf() // returns this
- .hasOwnProperty(v)
- .isPrototypeOf(v)
- .propertyIsEnumerable(v)
Objekt Function
- new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")
- .prototype
- .constructor
- .toString()
- .apply(thisArg, argArray)
- .call(thisarg[, arg1[, arg2, ...]])
- .length
- tüüpiline argumentide arv
Objekt Array (1)
- [12,,"tere"]
- new Array(length)
- new Array([elem1[, elem2[, ...]]])
- Paneb paika .length ja .0, .1, .2 jne
- .prototype
- .constructor
- .toString()
- .toLocaleString()
- .concat([elem1[, elem2[, ...]]])
- .join(separator)
Objekt Array (2)
- .prototype
- .pop()
- .push([elem1[, elem2[, ...]]])
- .shift()
- .unshift([elem1[, elem2[, ...]]])
- .reverse()
- .sort(võrdlusfunktsioon)
Objekt Array (3)
- .prototype
- .slice(algus, lõpp)
- tagastab Array elementidega [algus, lõpp), kui lõpp on undefined, siis kuni massiivi lõpuni
- .splice(algus, arv[, elem1[, elem2[, ...]]])
- asendab massiivi elemendid [algus, algus+arv) objektidega elem1, elem2, ...
Objekt String (1)
- .length
- .prototype
- .constructor
- .toString()
- .valueOf()
- .charAt(pos)
- .charCodeAt(pos) (Number)
- .concat([sõne1[, sõne2[, ...]]])
Objekt String (2)
- .prototype
- .indexOf(otsisõne, alustamispositsioon)
- .lastIndexOf(otsisõne, alustamispositsioon)
- .localeCompare(sõne)
- .match(regulaaravaldis)
- .replace(otsisõneVõiRegAvaldis, asendusVõiFunktsioon)
- .search(regulaaravaldis)
Objekt String (3)
- .prototype
- .slice(algus, lõpp)
- .split(eraldaja, limiit)
- .substring(algus, lõpp)
- .toLowerCase()
- .toLocaleLowerCase()
- .toUpperCase()
- .toLocaleUpperCase()
Objekt Number (1)
- .MIN_VALUE
- .MAX_VALUE
- .NaN
- .NEGATIVE_INFINITY
- .POSITIVE_INFINITY
- .prototype
- .toString(baas)
- .toLocaleString()
- .substring(algus, lõpp)
- .toLowerCase()
- .toLocaleLowerCase()
- .toUpperCase()
- .toLocaleUpperCase()
Objekt Number (2)
- .prototype
- .toString(baas)
- .toLocaleString()
- .valueOf()
- .toFixed(komakohti)
- .toExponential(komakohti)
- .toPrecision(täpsus)
Math, Date, RegExp, Error jne
- Kui jõuab veidi rääkida...
Lugemist
- ECMA-262: ECMAScript Language Specification
- ECMA-290: ECMAScript Components Specification
- ECMA-357: ECMAScript for XML (E4X) Specification)
- http://en.wikipedia.org/wiki/ECMAScript
- http://en.wikipedia.org/wiki/JavaScript
- http://developer.mozilla.org/en/docs/JavaScript
Tänan tähelepanu eest!