Useimmat JavaScriptin lauseet muistuttavat läheisesti Javan – ja siis C-kielen – lauseita. Mielenkiintoisia erojakin löytyy sekä syntaksista että semantiikasta!
while (a!=b) { sitä; sun; tätä; }
{ var a=77; { write(a); // 77 var a=33; // tarkoittaa samaa muuttujaa a! write(a); // 33 } write(a); // 33 }
function f() { var a=77; function g() { write(a); // undefined (HUOM!) var a=33; write(a); // 33 } g(); write(a); // 77 } f()
{ let a=77; { //write(a); tämä olisi virhe, koska lohkon a ei ole vielä määritelty let a=33; // tämä on uusi a, joka peittää ympäröivän lohkon a:n write(a); // 33 } write(a); // 77 }[Tuo sisemmän lohkon write(a) olisi mahdollista myös sallia, mutta tähän tulkintaan kielen suunnittelijat ovat päätyneet. Ja ihan perustellusti.]
{ let a=77; var b=99; { let a=33; var b=55; write(a); // 33 write(b); // 55 } write(a); // 77 write(b); // 55 }
if(new Boolean(false)) write(1231) // 1231
switch("123") { case 123: write("löysä"); break; default: write("tiukka"); // tämä tärppää } switch("") { case 0: write("löysä"); break; default: write("tiukka"); // tämä tärppää }
var a=4, c=5; var b = "*"; // tai 3 tai 1 tai muuta ... switch (b) { case a-1: write(22); // case-ehto voi olla dynaaminen break; case c-a: write(33); // eli lasketaan suoritusaikana break; case "*": write(44); // ehdot voivat olla eri tyyppisiä break; default: write(55) }Kokeile antaa b:n arvoksi 3, 1 ja jotain muuta.
for...in
var retki = {matka: 150, aika: 2, nopeus: function() {return this.matka/this.aika} } for (kentta in retki) write(kentta); // tulostus: matka // aika // nopeus
Huom: for-toiston askelmuuttuja on syytä määritellä let- tai edes var-määreellä, jotta sitä ei lisättäisi globaaliin ympäristöön. Äskeistä ohjelmaa t estiympäristöllä suoritettaessa window-olion loppuun jää suorituksen jälkeen seuraavaa:
... kentta: nopeus KeyboardEvent: function KeyboardEvent() { [native code] }Tyylikkäämpää on siis ohjelmoida vaikkapa seuraavaan tapaan:
for (let kentta in retki) write(kentta);
Esimerkiksi seuraavalla tavalla voidaan tulostaa myös kenttien arvot:
var retki = {matka: 150, aika: 2, nopeus: function() {return this.matka/this.aika} } for (let kentta in retki) write(kentta +": " + retki[kentta]) // tulostus: matka: 150 // aika: 2 // nopeus: function () {return this.matka/this.aika}Huomaa miten olion kenttänimiä voi käyttää taulukon indeksien tapaan! (Itse asiassa myös taulukot ovat olioita, joissa indeksit ovat kenttänimiä!)
var t = [11,22,33]; var a; // (myös tällä tavoin askelmuuttujaa ei viedä globaaliin ympäristöön!) for (a in t) write(a); // indeksit tulostuvat 0, 1, 2 t.nimi = "ikiomataulu"; // lisätään t:hen uusi attribuutti "nimi" for (a in t) write(a); // tulostuu 0, 1, 2, nimi for (a in t) write(t[a]); // tulostuu 11, 22, 33, ikiomataulu
for...of
var t = [11,22,33]; t.nimi = "ikiomataulu"; for (let a of t) write(a); // 11, 22, 33 // huom: lisätty atribuutti ei ole mukana!
forEach
var t = [11,22,33]; t.forEach(function(alkio) { write(alkio); // 11,22,33 });Tai uudemmalla funktioliteraalin kirjoitustavalla:
var t = [11,22,33]; t.forEach(alkio => { write(alkio); });
Huom: Kyseessä on siis ihan oikea sulkeuma! Jos parametrina annettu funktioliteraali sisältää viittauksia kirjoituskohdan paikallisiin muuttujiin, forEach todellakin pääsee manipuloimaan myös niitä:
var t = [11,22,33]; let i=0; t.forEach(alkio => { write(alkio); i=i+100; }); write(i); // 300
throw "Error2"; // String type throw 42; // Number type throw true; // Boolean type throw {toString: function() { return "I'm an object!"; } };Esimerkki:
try { var a = prompt("Anna luku."); a = parseInt(a); if (a==666) throw("hui"); if (a==7) throw("jee"); write("normaalia"); } catch (e) { if (e=="hui") write("pakoon") else if (e=="jee") write("mukaan") } finally { write("moi då"); }