SimonOX
Monday, December 16, 2019
Wednesday, October 10, 2012
JavaScript als funktionale Programmiersprache – Teil 2
Parameter und Parametervalidierung
function plus(x, y) {
return x + y;
}
print(plus(1,2,3)); // 3
print(plus()); // NaN
Funktionen als Konstuktor-Funktionen aufrufen
Achtung: Wenn die Funktion wie ein Konstruktor-Objekt (siehe folgendes Kapitel!) über die new-Anweisung aufgerufen wird, dann wird statt undefined das erzeugte Objekt zurückgegeben, falls die Funktion selbst keine Objekt als Rückgabewert hat!

Parameter und Parametervalidierung
function plusAll() {
var result = 0;
for (var i in arguments) {
result += arguments[i];
}
return result;
}
print(plusAll()); //0 print(plusAll(1,2,3,4,5)); // 15
function plusWithHandling(x, y) {
if (! x) {
throw("x is undefined");
}
y = y || 0; // 0 als Defaultwert
return x + y;
}
try {
print(plusWithHandling()); // Exception
} catch (e) {
print(e); // x is undefined
}
print(plusWithHandling(1)); // 1
print(plusWithHandling(0)); // 0
if (! x) {
throw("x is undefined");
}
Das Arguments-Array
Achtung: Das Array arguments ist kein echtes Array. Es hat zwar ein length-Attribut und man kann über dieses iterieren, allerdings fehlen ihm die Methoden eines echten Array-Objekts.
y = y || 0; // 0 als Defaultwert
function plusWithBetterHandling(x, y) {
if (typeof x === "undefined" || x < 0) {
throw("x is invalid");
}
if (typeof y === "undefined" || y < 0) {
y = 0;
}
return x + y;
}
print(plusWithBetterHandling(0, -1)); // 0 print(plusWithBetterHandling(0, "Meaning")); // 0;
function plusWithStrictHandling(x, y) {
if (typeof x !== "number") {
throw("x is of invalid type " + typeof x);
}
if (typeof y !== "number") {
y = 0;
}
return x + y;
}
print(plusWithStrictHandling(new Number(-1),5)); //x is of invalid type object
Tuesday, September 18, 2012
JavaScript als funktionale Programmiersprache – Teil 1
Obwohl der Kern von JavaScript relativ einfach ist, folgt JavaScript keinem strengen Programmierparadigma. Hier wird JavaScript als funktionale Programmiersprache dargestellt, denn ohne die funktionalen Aspekte lassen sich die weiteren Aspekte der Sprache nur schwer beschreiben.
Funktionsliteral
function plus(x, y) {
return x + y;
}
print(plus(1,2)); // 3
Funktionen als Konstuktor-Funktionen aufrufen
Achtung: Wenn die Funktion wie ein Konstruktor-Objekt über die new-Anweisung aufgerufen wird, dann wird statt undefined das erzeugte Objekt zurückgegeben, falls die Funktion selbst keine Objekt als Rückgabewert hat!
Funktionsnamen
Parameter
function plus(x, y) {
return x + y;
}
print(plus(1,2,3)); // 3
print(plus()); // NaN
function plusAll() {
var result = 0;
for (var i in arguments) {
result += arguments[i];
}
return result;
}
print(plusAll()); //0 print(plusAll(1,2,3,4,5)); // 15
Das Arguments-Array
Achtung: Das Array arguments ist kein echtes Array. Es hat zwar ein length-Attribut und man kann über dieses iterieren, allerdings fehlen ihm die Methoden eines echten Array-Objekts.
Thursday, August 23, 2012
Core JavaScript – Imperative Programmierung Teil 2 – Kontrollstrukturen und Schleifen
Kontrollstrukturen
If-Anweisung
if (x === y) { // Then-Block print("x ist y"); } else { // Else-Block print("x ist ungleich y"); }
Switch-Anweisung
switch (x) { case 3: { print("x ist 3"); break; // ansonsten wird default auch abgearbeitet } default: { print("Default"); } }
Schleifen
While-Schleife
var x = 0; while (x < 5) { print(x); // 0, 1, 2, 3, 4 x++; }
Do-While-Schleife
var x = 0; do { print(x); // 0, 1, 2, 3, 4, … x++; } while (x < 10);
For-Schleife
for (var i = 0, j = 100; i < 100; i++, j--) { print(i); print(j); };
Wenn die Eigenschaften in der Schleife hinzugefügt wurden, dann kann man sich nicht darauf verlassen, dass diese Eigenschaften in der Iteration berücksichtigt werden. Daher sollte das Objekt in der Schleife nicht verändert werden.
var foobar = {"foo": "hello", "bar": "world"}; for (var i in foobar) { print (i + " ist " + foobar[i]); }
Sprunganweisungen
outerloop: for (var x = 0; x < 100; x ++) { innerloop: for (var y = 0; y < 100; y++) { print (x + " : " + y); if (y > 10) break outerloop; } }
Monday, July 23, 2012
Core JavaScript – Imperative Programmierung Teil 1
Imperative Programmierung Teil 1
Ausdrücke und Operatoren
typeof ("42"*1) // number
Vergleiche
42 == “42” // true
42 === "42" // false
- false
- null
- undefined
- ” (leerer String)
- 0 (die Zahl Null) oder NaN (der Zahlenwert „Not a Number“)
!!0 // false
!!1 // true
Variablen
var x;
var x;
x == null; // true
typeof x; // undefined
x = 5;
x; // 5
typeof x; // number
var x, y, z;
Blöcke und Gültigkeit von Variablen
{
var x = 10;
print(x); // 10
}
{
var x = 10;
print(x); // 10
}
print(x); // 10
Achtung: Anders als in vielen anderen Programmiersprachen, wie Java und C, wird durch einen Block kein neuer Gültigkeitsbereich für Variablen definiert. Das heißt, auch Variablen, die in einem Block definiert wurden, sind außerhalb des Blocks nach ihrer Deklaration sichtbar.
Eine Variable sollte stets durch die Var-Anweisung definiert werden.
Außer über die var-Anweisung sollen sich lokale Variablen in der kommenden ECMAScript 6th Edition auch mit der let-Anweisung deklarieren und definieren lassen. Die let-Anweisung soll eindeutig zwischen lokalen und globalen Variablen unterscheiden. Zudem hat die let-Anweisung einen Blockgültigkeitsbereich und keinen Funktionsgültigkeitsbereich. Sie kommt daher der Variablendefinition anderer Sprachen wie Java sehr viel näher.
const PI = 3.14159265;
Zahlen
0.05 + 0.01 = 0.060000000000000005
const C1 = 299792458;
const C2 = 2.99792458E8; // C1 == C2
var saldo = -768;
print(0xFF); // liefert 255
NaN
var notANumber1 = NaN;
print(notANumber1 == NaN); // liefert false
print(isNaN("Hello")); // liefert true
print(isNaN("3.27E6")); // liefert false
Infinity
var infinite = 2E308;
print(infinite); // liefert Infinity
print(Infinity == infinite); // liefert true
print(infinite == infinite * 2); // liefert true
Formatierung und Konvertierung
Zeichenketten
typeof "Hello World" // String
var myString = "Hello World\nJetzt kommt eine neue Zeile";
print("¢" === "\u00A2"); // true
print("Hello World".length); //11
Die Methoden des String-Literals entsprechen den Methoden des String-Objekts, da intern das Literal zu einem Objekt wird, wenn eine Methode aufgerufen wird.
Boolesche Werte
typeof true // boolean
Arrays
var planets = ["Merkur", "Venus", "Erde", "Mars"];
print(planets[2]); // Erde
Array-Literal und Array-Objekt
typeof planets // object
Der typeof-Operator ist hier nicht hilfreich, da dieser sowohl bei einem String-Objekt als auch bei einem Array schlicht object zurückliefert. Zu prüfen, ob das übergebene Objekt die length-Eigenschaft hat, funktioniert leider auch nicht, denn Array-ähnliche Objekte wie Strings haben auch diese Eigenschaft. Man muss also zusätzlich prüfen, ob der Konstruktor des übergebenen Objekts der Array-Konstruktor ist:
function isArray(value) {
return (value && // value ist defined
typeof value === "object" && // value ist ein Objekt
value.constructor === Array) // Konstruktor ist Array
}
print(isArray(["eins", "zwei", "drei"])); // true
print (isArray("Hello")); // false
toArray-Hilfsmethode
function toArray(value) {
return Array().slice.call(value, 0);
}
print(toArray("Hello")); // H,e,l,l,o
print(toArray(47)); // empty
print(toArray(["eins", "zwei", "drei"])); // eins,zwei,drei
Reguläre Ausdrücke
var regexp = /\((\d*)\)/;
typeof /\((\d*)\)/; // function
var regexp = /\([\d\w]*\)/;
print("Telefon: (040) 55555".search(regexp)); //9
„\d“ und „\w“ sind Metazeichen.
var vorwahl = /^\([\d\w]*\)$/;
print("Telefon: (040) 55555".search(vorwahl)); //-1
print("(404)".search(vorwahl)); // 0
Kommentare
/*
var matches = /\d*/.match("1234");
*/
$ v8 blockcomments.js
blockcomments.js:2: SyntaxError: Unexpected token .
var matches = /\d*/.match(1234);
^
SyntaxError: Unexpected token .
// Folgender Codeblock demonstriert den Zeilenkommentar.
// Es wird der Wert 5 ausgegeben, da das Inkrement auskommentiert wurde.
var a = 5;
// a++;
print(a);
/*
Folgender Codeblock demonstriert den Zeilenkommentar.
Es wird der Wert 5 ausgegeben, da das Inkrement auskommentiert wurde.
*/
var a = 5;
// a++;
print(a);
Tokens und Whitespaces
Whitespaces, also Leerzeichen, Tabs und Zeilenumbrüche, werden verwendet, um einzelne Tokens voneinander zu trennen. Darüber hinaus haben sie keine Bedeutung. Man setzt sie ein, um Code zu strukturieren.
var a = 5 / 8
-8 + 9
print(a) // 1.625
var a = 5 / 8 - 8 + 9;
print(a);
Wednesday, July 18, 2012
Core JavaScript – Typen und Werte
Einleitung
Eine Skriptsprache wird dazu verwendet, um ein bereits bestehendes System zu verändern, anzupassen oder um wiederkehrende Abläufe zu automatisieren. In einem solchen System existieren bereits Funktionalitäten. In der Regel lassen sich diese entweder über ein User Interface oder über Befehle aufrufen. Wenn das System seine Funktionen über eine programmierbare Schnittstelle anbietet, dann ist es scriptbar. Ein gutes Beispiel für ein Script ist ein Shell-Script, das einem lästige Wartungsaufgaben abnimmt.
Typen und Werte
Schwache Typsierung
Literale
Typeof-Operator
typeof "Hallo Welt" // string
typeof 1234 //number
typeof true // boolean
typeof {"name": "Peter"} // object
typeof [1,2,3,] // object
Typenlose Verwendung
123 == "123" // true
Monday, May 14, 2012
JavaScript für Enterprise-Entwickler: Professionell programmieren im Browser und auf dem Server
JavaScript ist längst nicht mehr nur für klassische Webprogrammierer interessant. Auch bei der Entwicklung von Unternehmensanwendungen spielt JavaScript eine immer größere Rolle: Enterprise-Entwickler mit Java- oder .NET-Hintergrund programmieren selbst Server- und Browser-seitig mit JavaScript, oder sie überarbeiten JavaScript-Code, der von Webagenturen erstellt wurde.
Das Buch "JavaScript für Enterprise-Entwickler: Professionell programmieren im Browser und auf dem Server" behandelt daher die Schwerpunkte, die für Entwickler aus dem Enterprise-Umfeld beim Umgang mit JavaScript besonders von Bedeutung sind.
Nach einem kompakten Überblick über die Kernkonzepte von JavaScript geht der Autor im Detail auf wichtige Themen der professionellen Anwendungsentwicklung ein. Behandelt werden u.a.:
- JavaScript als funktionale, prototypische und objektorientierte Sprache
- Testen
- Packaging
- Entwurfsmuster
- node.js: JavaScript auf dem Server
Zielgruppe sind professionelle Backend-Enwickler, die sich schnell in JavaScript einarbeiten wollen. Darüber hinaus spricht das Buch Webentwickler an, die über den Browser-Rand hinausblicken möchten.
Kenntnisse in der Webentwicklung sind für die Lektüre erforderlich, ein Java-EE- (oder .NET-) Hintergrund ist hilfreich.
Die Website zum Buch ist hier. Das Buch erscheint heute in zwei Wochen.