In anderen Programmiersprachen bekommen Variablen beim Deklarieren einen Datentyp zugewiesen. Dadurch wird festgelegt wieviel Speicherplatz im Hauptspeicher für eine Variable oder für ein Literal reserviert wird. Ein Literal ist ein Wert. Es wird auch festgelegt was für eine Art von Information im Hauptspeicher gespeichert werden kann.
In Javascript haben wir eine lose Typisierung (loose Typing). Der Datentyp wird nicht festgelegt, er wird anhand des Wertes ermittelt und kann sich auch ändern.
Array, ist kein eigener Datentyp, jedoch ist ein Array äußerst wichtig.
Was würde wohl passieren wenn man es stattdessen so schreiben würde?
alert("x"+"y");
In der Alert Box steht dann xy
Das Pluszeichen hat hier eine andere Bedeutung, es dient als Verkettungsoperator mit dem man Strings verknüpft oder Strings mit Number-Werten aneinanderreiht. Ändere das alert Objekt folgendermaßen.
alert("das Ergebnis ist: " + (Number(x)+Number(y)))
Zu Beginn ein String in Anführungsstrichen, gefolgt von einem Pluszeichen, welches hier als Verkettungsoperator dient, dahinter, in Klammern eingeschlossen, die Addition.
Das Pluszeichen hat 2 Bedeutungen:
Bei primitiven Datenypen wird der Wert gespeichert, bei Referenztpyen wie Object wird ein Zeiger auf das Objekt gespeichert. Das hat folgende Auswirkungen:
var x = 2;
var y = x;
x=4;
console.log(y) // Ausgabe: 2
Bei der Initialisierung von y wird der Wert der Variablen x in y gespeichert, aber es wird nicht ein Zeiger auf x gespeichert, denn dann würde sich der Wert von y ändern, wenn man den Wert von x ändert. Genau das ist bei Referenztypen der Fall.
Es gibt 2 Operatoren, die der Ermittlung des Datentyps dienen, typeof
und instanceof
beides sind unäre Operatoren, das heißt sie benötigen nur einen Operanden.
Bei typeof
werden die einzelnen primitven Datentypen geliefert und bei allen Referenztypen der Wert object
. Das lässt sich testen mit
console.log(typeof 3);
typeof true //boolean
typeof 34 //number
typeof "Hallo" // string
typeof {} // object
typeof function(){} // function
typeof [] // object
typeof dient dazu
Object ist der Typ von dem alle Referenztypen ableiten. Mit typeof kann man den genauen Referenztyp nicht ermitteln. Dazu dient der instanceof Operator. Er lässt sich nur auf Werte, die einen Referenztyp enthalten anwenden.
var team = ["Klaus", "Willi", "Rita];
console.log(team instanceof Array); //true
console.log(team instanceof Object); // true
console.log(team instanceof Function); //false
console.log(34 instanceof Object); //false
Man kann einen Datentyp umwandeln in einen anderen Datentyp. Das nennt man Casting. Mehr dazu hier
Nehmen wir an, aus einer prompt Box soll eine numerische Eingabe verwertet werden. Die Prompt Box liefert jedoch nur Strings, die man jedoch als numerischen Wert benötigt um etwas zu berechnen. Hier kommt dann das Casting ins Spiel. In der Variable wert hat man nun einen numerischen, berechenbaren Wert.
let eingabe = "3" ;
let wert = Number(eingabe);
Neben den primitiven Datentypen und den speziellen Datentypen (null, undefined) gibt es die Referenzdatentypen wie Object. Der Unterschied besteht darin, dass bei Referenztypen die Daten anders gespeichert werden als bei den primitiven Datentypen.
Nehmen wir folgendes Beispiel
let x = 3; let y = x; x = 5; console.log(y); //3
Der Computer reserviert für jede Variable einen Speicherplatz. Wenn ich einer Variable eine andere Variable als Wert übergebe, wird nur der Wert der Variablen übergeben, nicht die Variable selbst.
Bei Referenztypen ist das anders. Wenn man ein Object einer anderen Variablen als Wert zuweist wird ein Zeiger auf das übergebene Objekt gelegt. Das bedeutet, wenn man eins der beiden ändert, ändert sich auch das andere.
let a={width: 100} let b = a; a.width = 1; console.log(b.width); //1 b.width = 5; console.log(a.width) //5
Bei Variablen primitiven Datentyps kopiert der Computer den gesamten Wert in die Speicheradresse.
Bei Variablen mit Referenztyp wird nur eine Referenz auf das übergebene Objekt gespeichert.
Objekte in Javascript siehe w3schools
Eigene Klassen und Objekte siehe w3schools