JavaScript - Eine Einführung (Stefan Bosse) [11.2020] |
Grundkonzepte von javaScript sind:
JavaScript ist dadurch sehr portabel und besitzt praktisch keine Abhängigkeiten zu der Rechnerarchitektur und dem Betriebssystem und ggfs. dem Browser!
Werte in JavaScript können sein:
true
und false
(𝔹)"text"
oder 'text'
(beide Varianten sind isomorph)Zusammengesetzte Werte (s.u.):
[1,2,3]
{x:1,y:2}
▸
|
✗
|
Variablen besitzen keinen Datentyp sondern sind polymorphe Referenzen auf Werte:
var p;
p=0;
p=[1,2,3]
print(typeof p)
Folgende Grunddatentypen können Werte besitzen:
Funktionen sind Werte erster Ordnung (λ Ausdrücke, d.h. hier anonyme Funktionen), die keinen, einen, oder mehrere Parameter (lokale Funktionsvariablen) besitzen können:
function (par1, par2?, ..) { .. return ε }
Variablen werden über das var Schlüsselwort definiert und können initial mit einem Wert geladen werden:
var x,y,z=expr;
Achtung: Variablen können einfach on-the-fly durch eine Zuweisung ohne var Schlüsselwort definiert werden. Das sollte vermieden werden da es sich dann um globale (überall sichtbare) variablen handelt! Aber: Um Daten zwischen den Snippets zu teilen müssen globale Variablen verwendet werden.
Ausdrücke setzen sich aus Variablen, konstanten Werten, Operatoren, und Funktionsaufrufen zusammen:
op1 + - / * % & && | || op2
f(arg1,arg2,..)
Zeichenketten sind unveränderlich und werden zwischen Hochkommatas definiert 'character'
oder "character"
Im folgenden Beispiel soll noch eine globale Variable result mit dem Wert true hinzugefügt werden...
▸
|
✗
|
▸
|
✗
|
undefined
. Eine Variable die mit var definiert aber nie einen Wert zugewiesen bekommen hat trägt zunächst immer den "definierten" Wert undefined!!!Wichtig: Eine nicht definierte Variable (also niemals mit var oder über eine Zuweisung eingeführt) liefert entweder einen Fehler wen sie gelesen wird (wie hier im Notebook) oder den Wert undefined!
typeof
kann der Datentyp des aktuellen Wertes einer Variable abgefragt werden.Arithmetical: + - * / %
Boolean: && ||
Logical: & |
Relational: == < > <= >= !=
Achtung: Wird eine Variable ohne Definition mittels der var Anweisung benutzt (auf der linken Seite einer Zuweisung), wird immer einer globale Variable erzeugt!
▸
|
✗
|
▸
|
✗
|
function name (par1?, par2?, ..) {
return expr
}
Folgende Funktion berechnet die mathematische Fakultät über das Konzept der Rekursion:
▸
|
✗
|
▸
|
✗
|
""
! Die letzten drei Werte entsprechen false! if (expression) { is true }
if (expression) { is true } else { is false }
Der else Zweig ist optional und wird nur dann ausgeführt wenn die Bedingung falsch (0) ist.
if-else Anweisungen "kaskadiert" (verkettet) werden, d.h. if-else-if-else..
Bedingungen werden z.B. mit relationalen Operationen getestet:
▸
|
✗
|
x=0
setzt?switch (expression) {
case v1: .. break;
case v2: .. break;
..
default: ..
}
Nach jedem Fall muss eine
break
Anweisungen folgen (bzw. Abschluss eines Falls), sonst werden die nachfolgenden Fälle eines ausgewählten Falls auch ausgeführt ("fall through behaviour"). Es sei denn dieses Verhalten ist erwünscht.
▸
|
✗
|
for (init;test;change) {
..
}
for (i=a;i<b;i++) {
..
}
▸
|
✗
|
while (condition) {
..
}
{
..
} do (condition)
▸
|
✗
|
▸
|
✗
|
Arrays können mehrsortig sein, d.h. die Elemente eines Arrays können von beliebigen Datenyp sein!
[1,2,3]
[1,true,'test']
[{x:1},{x:2},{y:1}]
Erzeugung eines Arrays mit Werten durch eckige Klammerpaare [v1,v2,..]
Arrays von Arrays sind auch möglich (Matrizen), z.B. [[1,2],[3,4]]
Zugriff auf Arrayelement durch Indexoperator array[index]
, ebenso Wertzuweisung möglich.
Bei mehrdimensionales Arrays array[row][col]
Erstes Element eines Arrays hat den Index 0!
▸
|
✗
|
array.length()
mappedarray = array.map(function (v,index) { return expr })
filteredarray = array.filter(function (v,index) { return true or false })
array.push(v)
last = array.pop()
copy = array.slice()
sub = array.slice(a,a+n);
revarray = array.reverse()
▸
|
✗
|
▸
|
✗
|
Implementiere eine Funktion die die ersten Fibonacci Zahlen im Bereich [1,9] berechnet und als Array zurück gibt
Nutze eine Zählschleife for
▸
|
✗
|
{
attribute : value,
..
}
Dabei sind die Attribute Elementnamen die beliebige Werte besitzen können (veränderlich)
Auf ein Element (Attribut) eines Objekts wird durch den Punktoperator sowohl lesend als auch schreibend zugegriffen record.attribute
Werte von Attributen können weitere Datenstrukturen sein, so dass sich eine Punktoperatorkette ergibt record.selector.selector.
▸
|
✗
|
Arrays sind in javaScritp mehrsortig, d.h. jedes Element kann einen Wert unterschiedlichsten Datentyps enthalten
Daher können Arrays und Rekords (rein Datenstrukturen) gemischt werden
Elemente von komplexen Strukturen mit Arrays können durch eine Kette von Dereferenzierungen erreicht werden s.x.y[i].z
▸
|
✗
|
-- Definition der Konstruktorfunktion --
function C(par1,..) {
this.x1=expression;
..
}
-- Definition der Prototypen --
C.prototype.methode1 = function (par1,..) {
this.x1=..
}
C.prototype.methode2 = function (par1,..) {
this.x1=..
}
..
-- Instanziierung eines Objekts von der Konstruktirfunktion --
var obj = new C(..);
obj.methode1(..)
obj.methode2(..)
..
▸
|
✗
|
Math.sin(rad)
Math.cos(rad)
Math.tan(rad)
Math.pow(x,e)
Math.log(x)
Math.sqrt(x)
Math.abs(x)
Math.random()
▸
|
✗
|
|
In Notebooks und Workbooks kann eine erweiterte Bibliothek geladen bzw. enthalten sein (Plugin math.plugin
)
Dabei bringt die Erweiterung auch zusätzliche Funktionen/Methoden für Arrays mit sich:
// Module
Math.Vector.
Math.Matrix.
Math.random.
Math.signal.
// Funktionen
Math.equal(a,b)
Math.distance(p1,p2)
// Array Erweiterungen
array.add(b) // [a0+b0,a1+b1,..]
array.contains(x)
..
Math.statistics
→ Math.statistics APIMath.statistics.analysis(data)
Math.statistics.entropy(list)
▸
|
✗
|
|