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å");
}