Das Erlernen einer Programmiersprache hat nur zwei Aspekte: eine ist Syntax und der andere ist Datentyp. Die Syntax von c-ähnlichen Sprachen ist nichts anderes als, wenn, wie für Funktionen, arithmetische Operationen usw. und objektorientierte Sprachen zu Objekt hinzugefügt werden.
Syntax ist nur eine Reihe von Regeln, die Sprachdesigner im Voraus ergeben haben. Die Grammatik verschiedener Sprachen ist unterschiedlich, aber alle haben einige gemeinsame Punkte. Für diejenigen, die mit ein oder zwei Programmiersprachen vertraut sind, ist die Grammatik beim Erlernen anderer Programmiersprachen oft kein Problem (wenn Sie C-ähnliche Sprachen gelernt haben, dauert es auf jeden Fall einige Zeit, bis sich zum ersten Mal in Lisp eingesetzt wird). Der Schwerpunkt des Lernens liegt häufig auf Datentypen und verwandten Operationen, und es gibt kein altes Sprichwort: "Datenstruktur + Algorithmus = Programm"! Zweitens hat die Syntax einiger Sprachen selbst Designprobleme (JavaScript ist noch mehr), sodass wir uns nicht mit diesen Punkten befassen müssen. Wenn Sie behaupten, Geek zu sein, können Sie natürlich damit spielen.
Dieser Artikel enthält eine detaillierte Einführung in die Datentypen in JavaScript.
Schwacher Typ gegenüber starker Typ
In Anbetracht der Designphilosophie von JavaScript wurde JavaScript als schwache Sprache entwickelt.
Apropos, es ist unvermeidlich, über den Unterschied zwischen schwachen und starken Typen zu sprechen.
Einige Leute denken fälschlicherweise, dass der Unterschied zwischen beiden darin besteht, dass "eine stark typisierte Sprache ihren Typ beim Deklarieren einer Variablen angeben muss, während eine schwach typisierte Art nicht verwendet". Tatsächlich ist diese Ansicht falsch. Zum Beispiel der folgende Java -Code -Snippet:
Die Codekopie lautet wie folgt:
String S = "Hallo";
int l = S.GetBytes (). Länge;
Woher weiß der Compiler, dass Länge ein rechtlicher Ausdruck ist? Dies liegt daran, dass der Compiler weiß, dass der Datentyp von S String ist. Wenn die GetBytes -Methode der String aufgerufen wird, ist der Datentyp des Rückgabewerts Byte [], daher ist Länge ein rechtlicher Ausdruck.
Der wahre Unterschied zwischen den beiden ist:
In stark typisierten Sprachen kann der Typ jedes Ausdrucks zu Kompilierungszeit ermittelt werden und nur Operationen, die für diesen Typ gelten, sind zulässig.
Schwache Sprachen ermöglichen es, dass jede Operation einen beliebigen Typ auferlegt wird. Dieser Vorgang kann jedoch zur Laufzeit einen Fehler melden.
Datentyp
Gemäß der Spezifikation von ECMascript 5.1 gibt es in JavaScript sechs Datentypen, nämlich undefined, Null, Boolean, Nummer, String und Objekt. Die ersten fünf gehören zu Grundtypen und die letzte gehört zu Objekttypen.
Grundlegende Datentypen
Der undefinierte Typ hat nur einen Wert, der undefiniert ist, was "Nullwert" bedeutet, der für alle Datentypen gilt.
Der Null -Typ hat nur einen Wert, der null ist, was "kein Objekt" bedeutet und nur für Objekttypen gilt.
Boolescher Typ hat zwei Werte, wahr und falsch
Werte der Typzahlen sind Sätze von 64-Bit-Gleitkomma-Nummern, die dem IEEE 754-Standard folgen, ähnlich wie das Doppel von Java. Es gibt keine ganzzahlige Datenstruktur. Darüber hinaus gibt es drei besondere Werte: Nan, Infinity, -Infinity
Ein Wert der Typ -Zeichenfolge ist eine Sammlung endlicher Unicode -Zeichen. Muss mit 'oder' eingeschlossen sein.
Null und undefiniert
Sowohl Null als auch Undefined repräsentieren das Konzept von "Nicht-Wert", wenn es streng unterschieden wird:
- Null bedeutet leer
- undefiniert bedeutet, dass es nicht existiert. Dieser Wert sind alle Variablen ohne Initialisierung, fehlende Parameter in der Funktion und ohne expliziten Rückgabewert.
In anderen Sprachen wird nur ein Null verwendet, um Nullwerte darzustellen. Warum gibt es in JavaScript ein undefiniertes? Dies wird durch historische Gründe verursacht:
JavaScript übernimmt die Java -Syntax und unterteilt die Typen in Grundtypen und Objekttypen. In Java wird Null verwendet, um leere Objekte darzustellen, und JavaScript erbt sie als selbstverständlich. In der C -Sprache ist NULL 0, wenn er in eine Zahl konvertiert wird, und JavaScript verwendet auch die gleiche Methode:
Die Codekopie lautet wie folgt:
> Nummer (NULL)
0
> 5 + null
5
In JavaScript 1.0 gibt es noch keine Ausnahmebehandlung. Für einige Ausnahmen (keine initialisierten Variablen, fehlende Parameter beim Aufrufen von Funktionen usw.) müssen sie als besonderer Wert markiert werden. Null ist eine gute Wahl, aber Brendan Eich möchte die folgenden zwei Dinge vermeiden:
- Dieser besondere Wert sollte kein Referenzattribut haben, da er objektspezifisch ist
- Dieser besondere Wert sollte nicht in 0 konvertiert werden, da es nicht einfach ist, Fehler im Programm zu erkennen
Aus diesen beiden Gründen wählte Brendan Eich undefinierte, was zur Nan gezwungen werden kann.
Die Codekopie lautet wie folgt:
> Nummer (undefiniert)
Nan
> 5 + undefiniert
Nan
Die Ergebnisse sind im Umgang mit JSON -Objekten sehr unterschiedlich:
Die Codekopie lautet wie folgt:
> JSON.PARSE (NULL)
NULL
> Json.parse (undefiniert)
// Firfox SyntaxError: JSON.Parse: Unerwartetes Zeichen in Zeile 1 Spalte 1 der JSON -Daten
// Chrom -SyntaxEerror: Unerwartetes Token U.
> JSON.Stringify (NULL)
"null"
> Json.Stringify (undefiniert)
undefiniert
Objekttyp
Als Skriptsprache hat JavaScript selbst sehr optimierte Funktionen und viele Funktionen (Lesen und Schreiben von Dateien, Netzwerk usw.) werden von der Hostumgebung bereitgestellt. Die Brücke zwischen der Wirtsumgebung und der JavaScript -Sprache ist Objekte. Die Hostumgebung bietet eine Vielzahl von Funktionen, indem eine Reihe von Objekten bereitgestellt wird, die der JavaScript -Syntax entsprechen.
In diesem Artikel in javaScript-objektorientiertem Programmieren (wenn Sie nicht wissen, was ein Prototyp ist, empfehle ich dringend, diesen Artikel zu lesen), habe ich wiederholt betont, dass Objekte eine Reihe von Schlüsselwertpaaren in JavaScript sind, genau wie Hashmap in Java. Die Eigenschaften von Objekten in JavaScript können jedoch einige Deskriptoren (Eigenschaftendeskriptoren) haben, die nicht in HashMap verfügbar sind.
Attributdeskriptor
Attributdeskriptoren sind in zwei Kategorien unterteilt:
Data Descriptor (Data Descriptor) enthält eine Reihe von Booleschen Werten, um anzuzeigen, ob das Attribut Änderungen und Löschen ermöglicht.
Accessor Deskriptor, einschließlich Get and Set -Funktionen.
Beide Deskriptoren sind Objekte, und beide haben die folgenden zwei Booleschen Eigenschaften:
Konfigurierbar wird angeben, ob der Deskriptor Änderungen und Löschen ermöglicht. Standard ist falsch.
Aufzählbar wird angeben, ob Sie auf die Eigenschaft zugreifen sollen, wenn es ein Objekt durchquert (mit der Methode für ... in der Schleife oder der Objekt.Keys -Methode). Standard ist falsch.
Zusätzlich zu den beiden oben genannten gängigen Attributen verfügt der Datendeskriptor über die folgenden zwei Attribute:
- Der Wert wird verwendet, um den Wert dieser Eigenschaft anzugeben. Der Standard ist nicht definiert
- Beschreibbar wird angeben, ob der Wert der Eigenschaft die Änderung des Wertes der Eigenschaft ermöglicht. Der Standard ist falsch
Es gibt zwei Eigenschaften für Zugriffsdeskriptoren:
- GET wird verwendet, um den Accessor (Getter, im Wesentlichen eine Funktion) beim Zugriff auf die Eigenschaft anzugeben, und der Rückgabewert des Accessors ist der Wert der Eigenschaft. Standardeinstellung ist undefiniert
- SET wird verwendet, um den Evaluator (Setter, im Wesentlichen eine Funktion) beim Zugriff auf diese Eigenschaft anzugeben. Der Bewerter akzeptiert einen Parameter. Standardeinstellung ist undefiniert
Wir können Object.DefineProperty verwenden, um den Eigenschaftsdeskriptor des Objekts festzulegen. Zum Beispiel:
Die Codekopie lautet wie folgt:
// __Proto__ verwenden
Object.DefineProperty (OBJ, 'Key', {
__Proto__: null, // Nein erbte Eigenschaften
Wert: 'statisch' // nicht aufzählbar
// nicht konfigurierbar
// nicht beschreibbar
// standardmäßig
});
Aus dem obigen Beispiel können wir sehen, dass Deskriptoren die Merkmale der Vererbung haben. Wir setzen das __Proto__ des Deskriptorobjekts ausdrücklich auf NULL, wodurch die entsprechenden Attribute von Object.Prototype vermieden werden. Natürlich können wir auch alle Eigenschaften des Deskriptors explizit festlegen:
Die Codekopie lautet wie folgt:
// explizit sein
Object.DefineProperty (OBJ, 'Key', {
Aufzählbar: Falsch,
Konfigurierbar: Falsch,
Beschreibbar: Falsch,
Wert: 'statisch'
});
Dieser Effekt entspricht dem ersten Codestück.
Hier ist ein weiteres Beispiel für den Zugriffsdeskriptor:
Die Codekopie lautet wie folgt:
// Beispiel für eine Objekteigenschaft, die mit DefineProperty mit einem Accessor -Eigenschaftsbeschreibung hinzugefügt wurde
var bValue = 38;
Object.DefineProperty (OBJ, 'Key', {
get: function () {return bValue; },
set: function (newValue) {bValue = newValue; },
Aufzählbar: wahr,
Konfigurierbar: True
});
Es ist zu beachten, dass Zugriffsdeskriptoren und Datendeskriptoren nicht verwirrt werden können. Es ist falsch, Folgendes zu schreiben:
Die Codekopie lautet wie folgt:
// Sie können nicht versuchen, beide zu mischen:
Object.DefineProperty (OBJ, 'Konflikt', {
Wert: 0x9f91102,
get: function () {return 0xDeadbeef; }
});
// wirft einen Typeerror aus: Eigenschaftsdeskriptoren dürfen keinen Wert angeben
// oder beschreibbar sein, wenn ein Getter oder Setter angegeben wurde
Typof
Wenn Sie die Art einer Variablen zur Laufzeit kennen möchten, können Sie den Typeof -Operator verwenden. Der Rückgabewert von Typof lautet wie folgt:
Eine Sache, die beachtet werden muss, ist typeof null == "Objekt". Gemäß dem Standard -ECMAScript 5.1 sollte der Null -Typ ein Grundtyp sein. Warum wird das Objekt hierher zurückgegeben? Der Grund ist Folgendes:
In JavaScript 1.0 wird der Wert in JavaScript durch eine Struktur wie ein Typ -Tag und einen tatsächlichen Wert dargestellt. Das Typ -Flag des Objekts beträgt 0, und Null repräsentiert einen Nullzeiger (0x00) in der C -Sprache, sodass das Typ -Flag von Null 0 beträgt.
Das obige ist der gesamte Inhalt dieses Artikels. Bitte beachten Sie es, wenn Sie es brauchen.