Im dritten Teil der Übersetzung des JavaScript-Handbuchs werden wir heute über verschiedene Möglichkeiten zum Deklarieren von Variablen, Datentypen, Ausdrücken und zum Arbeiten mit Objekten sprechen.
→
Teil 1: Erstes Programm, Sprachfunktionen, Standards→
Teil 2: Codestil und Programmstruktur→
Teil 3: Variablen, Datentypen, Ausdrücke, Objekte→
Teil 4: Funktionen→
Teil 5: Arrays und Loops→
Teil 6: Ausnahmen, Semikolons, Platzhalterliterale→
Teil 7: Strict Mode, dieses Schlüsselwort, Ereignisse, Module, mathematische Berechnungen→
Teil 8: Übersicht über die ES6-Funktionen→
Teil 9: Übersicht über die ES7-, ES8- und ES9-Standards
Variablen
Eine Variable ist eine Kennung, der ein Wert zugewiesen wird. Auf die Variable kann im Programm zugegriffen werden, wobei auf diese Weise mit dem ihr zugewiesenen Wert gearbeitet wird.
Eine Variable in JavaScript selbst enthält keine Informationen über den Wertetyp, der darin gespeichert wird. Dies bedeutet, dass Sie durch Schreiben in eine Variable, z. B. eine Zeichenfolge, später eine Zahl in diese schreiben können. Eine solche Operation verursacht keinen Fehler im Programm. Aus diesem Grund wird JavaScript manchmal als "untypisierte" Sprache bezeichnet.
Bevor eine Variable verwendet wird, muss sie mit dem Schlüsselwort
var
oder
let
deklariert werden. Wenn es um Konstanten geht, wird das Schlüsselwort
const
verwendet. Das Deklarieren einer Variablen und das Zuweisen eines bestimmten Werts ist ohne Verwendung dieser Schlüsselwörter möglich, dies wird jedoch nicht empfohlen.
▍ Schlüsselwort var
Vor dem ES2015-Standard war die Verwendung des Schlüsselworts
var
die einzige Möglichkeit, Variablen zu deklarieren.
var a = 0
Wenn
var
in diesem Konstrukt weggelassen wird, wird der Wert einer nicht deklarierten Variablen zugewiesen. Das Ergebnis dieser Operation hängt vom Modus ab, in dem das Programm ausgeführt wird.
Wenn also der sogenannte strikte Modus aktiviert ist, führt dies zu einem Fehler. Wenn der strikte Modus nicht aktiviert ist, wird eine implizite Variablendeklaration durchgeführt und dem globalen Objekt zugewiesen. Dies bedeutet insbesondere, dass eine Variable, die in einer bestimmten Funktion implizit auf diese Weise deklariert ist, auch dann verfügbar ist, wenn die Funktion ihre Arbeit abgeschlossen hat. Normalerweise wird erwartet, dass in Funktionen deklarierte Variablen ihre Grenzen nicht überschreiten. Es sieht so aus:
function notVar() { bNotVar = 1 // } notVar() console.log(bNotVar)
Es wird
1
Konsole
bNotVar = 1
, normalerweise erwartet niemand dieses Verhalten vom Programm. Der Ausdruck
bNotVar = 1
sieht nicht wie ein Versuch aus, eine Variable zu deklarieren und zu initialisieren, sondern wie ein Versuch, auf eine Variable zuzugreifen, die sich in einem externen Bereich der Funktion befindet (dies ist ganz normal). Infolgedessen verwirrt die implizite Deklaration von Variablen denjenigen, der den Code liest, und kann zu unerwartetem Programmverhalten führen. Später werden wir über Funktionen und Bereiche sprechen. Versuchen Sie vorerst immer, spezielle Schlüsselwörter zu verwenden, wenn die Bedeutung eines Ausdrucks darin besteht, eine Variable zu deklarieren. Wenn in diesem Beispiel der Funktionskörper als
var bNotVar = 1
umgeschrieben wird, führt der Versuch, das obige Codefragment zu starten, zu einer Fehlermeldung (die in der Browserkonsole angezeigt wird).
Es könnte beispielsweise so aussehen
Uncaught ReferenceError: bNotVar is not defined
. Seine Bedeutung beruht auf der Tatsache, dass das Programm nicht mit einer nicht vorhandenen Variablen arbeiten kann. Es ist viel besser, wenn Sie das Programm zum ersten Mal starten, eine solche Fehlermeldung zu sehen, als unverständlichen Code zu schreiben, der sich unerwartet verhalten kann.
Wenn beim Deklarieren einer Variablen diese nicht initialisiert wird und ihr kein Wert zugewiesen wird, wird ihr automatisch der
undefined
Wert zugewiesen.
var a //typeof a === 'undefined'
Mit dem Schlüsselwort
var
deklarierte Variablen können wiederholt deklariert werden, indem ihnen neue Werte zugewiesen werden (dies kann jedoch jemanden verwirren, der den Code liest).
var a = 1 var a = 2
Sie können mehrere Variablen in einem Ausdruck deklarieren:
var a = 1, b = 2
Der Bereich einer Variablen wird als Bereich des Programms bezeichnet, in dem auf diese Variable zugegriffen werden kann (sichtbar).
Eine Variable, die mit dem Schlüsselwort
var
außerhalb einer Funktion initialisiert wurde, wird einem globalen Objekt zugewiesen. Es hat einen globalen Geltungsbereich und ist von überall im Programm zugänglich. Wenn eine Variable mit dem Schlüsselwort
var
in einer Funktion deklariert wird, ist sie nur innerhalb dieser Funktion sichtbar und eine lokale Variable für sie.
Wenn eine Variable in einer Funktion mit
var
deklariert wird, deren Name mit dem Namen einer bestimmten Variablen aus dem globalen Bereich übereinstimmt, wird die globale Variable "überschrieben". Das heißt, wenn auf eine solche Variable innerhalb der Funktion zugegriffen wird, wird ihre lokale Version verwendet.
Es ist wichtig zu verstehen, dass Blöcke (Codebereiche in geschweiften Klammern) keine neuen Sichtbarkeitsbereiche erzeugen. Beim Aufruf der Funktion wird ein neuer Bereich erstellt. Das Schlüsselwort
var
hat einen sogenannten Funktionsumfang, keinen Blockbereich.
Wenn eine Variable im Funktionscode deklariert ist, ist sie für den gesamten Funktionscode sichtbar. Auch wenn eine Variable am Ende des Funktionscodes mit
var
deklariert ist, können Sie am Anfang des Codes darauf verweisen, da der Mechanismus zum Auslösen von Variablen (Heben) in JavaScript funktioniert. Dieser Mechanismus "löst" Variablendeklarationen aus, nicht jedoch die Operationen ihrer Initialisierung. Dies kann zu Verwirrung führen. Machen Sie es daher zur Regel, Variablen am Anfang einer Funktion zu deklarieren.
▍ Schlüsselwort lassen
Das Schlüsselwort let erschien in ES2015, das vereinfacht als "Block" -Version von
var
. Der Umfang der mit dem Schlüsselwort
let
deklarierten Variablen ist auf den Block, Operator oder Ausdruck, in dem er deklariert ist, sowie auf verschachtelte Blöcke beschränkt.
Wenn das Wort "let" selbst nicht sehr klar erscheint, kann man sich vorstellen, dass stattdessen das Wort "let" verwendet wird. Dann kann der Ausdruck
let color = 'red'
wie folgt ins Englische übersetzt werden: "let the color be red" und wie folgt ins Russische: "let the color be red".
Mit dem Schlüsselwort
let
können Sie die mit dem Schlüsselwort
var
verbundenen Mehrdeutigkeiten beseitigen (z. B. können Sie dieselbe Variable mit
let
nicht zweimal deklarieren). Wenn Sie
let
außerhalb der Funktion verwenden, z. B. beim Initialisieren von Schleifen, werden keine globalen Variablen erstellt.
Ein solcher Code verursacht beispielsweise einen Fehler:
for (let i = 0; i < 5; i++) { console.log(i) } console.log(i)
Wenn bei der Initialisierung der Schleife der Zähler
i
mit dem Schlüsselwort
var
deklariert wird, ist
i
nach Abschluss außerhalb der Schleife verfügbar.
Heutzutage können Sie bei der Entwicklung von JS-Programmen, die auf modernen Standards basieren,
var
vollständig aufgeben und nur die Schlüsselwörter
let
und
const
.
▍Tastenwort const
Mit den Schlüsselwörtern
var
oder
let
deklarierte Variablen können überschrieben werden. Wenn anstelle dieser Schlüsselwörter
const
verwendet wird, können Sie einer mit ihrer Hilfe deklarierten und initialisierten Konstante keinen neuen Wert zuweisen.
const a = 'test'
In diesem Beispiel kann der Konstante
a
kein neuer Wert zugewiesen werden. Es sollte jedoch beachtet werden, dass die Verwendung des Schlüsselworts
const
dieses Objekt nicht vor Änderungen schützt, wenn
a
kein primitiver Wert wie eine Zahl, sondern ein Objekt ist.
Wenn sie sagen, dass ein Objekt in eine Variable geschrieben ist, meinen sie tatsächlich, dass sich die Variable auf das Objekt bezieht. Dieser Link kann nicht geändert werden, und das Objekt, zu dem der Link führt, kann geändert werden.
Das Schlüsselwort
const
macht Objekte nicht unveränderlich. Es schützt lediglich vor Änderungen der Verweise darauf, die in den entsprechenden Konstanten geschrieben sind. So sieht es aus:
const obj = {} console.log(obj.a) obj.a = 1 // console.log(obj.a) //obj = 5 //
In der
obj
Konstante wird bei der Initialisierung ein neues leeres Objekt geschrieben. Der Versuch, auf seine Eigenschaft
a
zuzugreifen, die nicht vorhanden ist, verursacht keinen Fehler. Die Konsole wird
undefined
. Danach fügen wir dem Objekt eine neue Eigenschaft hinzu und versuchen erneut, darauf zuzugreifen. Diesmal wird der Wert dieser Eigenschaft -
1
- an die Konsole gesendet. Wenn Sie die letzte Zeile des Beispiels auskommentieren, führt ein Versuch, diesen Code auszuführen, zu einem Fehler.
Das Schlüsselwort
const
ist sehr ähnlich zu
let
, insbesondere hat es einen Blockbereich.
Unter modernen Bedingungen ist es durchaus akzeptabel, das Schlüsselwort
const
zu verwenden
let
nur in besonderen Fällen auf
let
zuzugreifen und alle Entitäten zu deklarieren, deren Werte nicht geändert werden sollen. Warum? Die Sache ist, dass es am besten ist, möglichst einfache Konstruktionen zu verwenden, um Programme nicht zu komplizieren und Fehler zu vermeiden.
Datentypen
JavaScript wird manchmal als "untypisierte" Sprache bezeichnet, dies ist jedoch nicht der Fall. Es ist wahr, dass Sie Werte unterschiedlichen Typs in Variablen schreiben können, aber es gibt dennoch Datentypen in JavaScript. Insbesondere sprechen wir über primitive und Objektdatentypen.
Um den Datentyp eines bestimmten Werts zu bestimmen, können Sie den Operator
typeof
. Es wird eine Zeichenfolge zurückgegeben, die den Operandentyp angibt.
▍ Primitive Datentypen
Hier ist eine Liste primitiver JavaScript-Datentypen:
number
string
(string)boolean
(Boolescher Wert)null
(spezieller null
)undefined
(Sonderwert undefined
)symbol
(Symbol, in besonderen Fällen verwendet, erschien in ES6)
Hier werden die Namen der Datentypen in der Form angegeben, in der der Operator
typeof
zurückgibt.
Lassen Sie uns über die am häufigsten verwendeten Datentypen aus dieser Liste sprechen.
Geben Sie die Nummer ein
Werte vom Typ
number
in JavaScript werden als 64-Bit-Gleitkommazahlen mit doppelter Genauigkeit dargestellt.
Im Code werden numerische Literale im Dezimalsystem als Ganz- und Bruchzahlen dargestellt. Sie können andere Methoden verwenden, um Zahlen aufzuzeichnen. Wenn zum Beispiel am Anfang eines numerischen Literal ein Präfix
0x
steht, wird es als Zahl in hexadezimaler Schreibweise wahrgenommen. Zahlen können auch in Exponentialschreibweise geschrieben werden (in solchen Zahlen finden Sie den Buchstaben
e
).
Hier sind Beispiele für ganzzahlige Einträge:
10 5354576767321 0xCC //
Hier sind die Bruchzahlen.
3.14 .1234 5.2e4 //5.2 * 10^4
Numerische Literale (dieses Verhalten ist auch für einige andere primitive Typen charakteristisch) werden beim Versuch, als Objekte auf sie zuzugreifen, automatisch für die Dauer der Operation in die entsprechenden Objekte konvertiert, die als "Objekt-Wrapper" bezeichnet werden. In diesem Fall handelt es sich um die Objekt-Wrapper-
Number
.
Hier sieht es beispielsweise wie ein Versuch aus, auf die Variable
a
zuzugreifen, in die ein numerisches Literal als Objekt in der Google Chrome-Konsole geschrieben ist.
Tooltip zum Umschließen von ZahlenobjektenWenn Sie beispielsweise die
toString()
-Methode eines Objekts vom Typ
Number
, wird eine Zeichenfolgendarstellung der Nummer zurückgegeben. Es sieht aus wie der entsprechende Befehl, der in der Browserkonsole (und im regulären Code) wie folgt ausgeführt werden kann:
a.toString()
Beachten Sie die doppelten Klammern nach dem Methodennamen. Wenn Sie sie nicht einfügen, gibt das System keinen Fehler aus, aber anstelle der erwarteten Ausgabe verfügt die Konsole über etwas, das nicht wie eine Zeichenfolgendarstellung der Nummer 5 aussieht.
Das globale
Number
Objekt kann in Form eines Konstruktors verwendet werden, der mit seiner Hilfe neue Zahlen erstellt (obwohl es in dieser Form fast nie verwendet wird). Es kann als unabhängige Entität verwendet werden, ohne Instanzen davon zu erstellen (dh einige daraus dargestellte Zahlen) Hilfe). Beispielsweise enthält die
Number.MAX_VALUE
Eigenschaft den maximalen numerischen Wert, der in JavaScript dargestellt werden kann.
Geben Sie string ein
Werte vom Typ
string
sind Zeichenfolgen. Solche Werte werden als Zeichenfolgenliterale in einfachen oder doppelten Anführungszeichen angegeben.
'A string' "Another string"
Zeichenfolgenwerte können mithilfe des Backslash-Zeichens in mehrere Teile aufgeteilt werden.
"A \ string"
Eine Zeichenfolge kann sogenannte Escape-Sequenzen enthalten, die beim Drucken der Zeichenfolge auf der Konsole interpretiert werden. Beispielsweise bedeutet die Sequenz
\n
ein Zeilenumbruchzeichen. Das Backslash-Zeichen kann auch verwendet werden, um Zeichenfolgen, die in demselben Anführungszeichen enthalten sind, in Anführungszeichen zu setzen. Wenn Sie das Anführungszeichen mit
\
maskieren, wird es vom System nicht als Sonderzeichen wahrgenommen.
'I\'ma developer'
Zeichenfolgen können mit dem Operator
+
verkettet werden.
"A " + "string"
Vorlagenliterale
ES2015 führte die sogenannten Musterliterale oder Musterzeichenfolgen ein. Sie sind Zeichenfolgen, die in Backticks (
`
) eingeschlossen sind und einige interessante Eigenschaften haben.
`a string`
In Vorlagenliteralen können Sie beispielsweise bestimmte Werte ersetzen, die sich aus der Auswertung von JavaScript-Ausdrücken ergeben.
`a string with ${something}` `a string with ${something+somethingElse}` `a string with ${obj.something()}`
Die Verwendung von Anführungszeichen erleichtert das Schreiben von mehrzeiligen Zeichenfolgenliteralen:
`a string with ${something}`
Geben Sie boolean ein
In JavaScript werden einige reservierte Wörter verwendet, wenn mit booleschen Werten gearbeitet wird. Diese sind
true
(true) und
false
(false). Vergleichsoperationen wie
==
,
===
,
<
,
>
geben
true
oder
false
.
Logische Ausdrücke werden in Konstrukten wie
if
und
while
, um den Fortschritt eines Programms zu steuern.
Es sollte beachtet werden, dass Sie, wenn
true
oder
false
erwartet wird, andere Werte verwenden können, die von der Sprache automatisch als wahr (wahr) oder falsch (falsch) angesehen werden.
Insbesondere sind die folgenden Werte falsch:
0 -0 NaN undefined null '' //
Die restlichen Werte sind wahr.
Geben Sie null ein
JavaScript hat einen speziellen
null
, der das Fehlen eines Werts anzeigt. Ähnliche Bedeutungen werden in anderen Sprachen verwendet.
Geben Sie undefined ein
Der in eine bestimmte Variable geschriebene
undefined
Wert gibt an, dass diese Variable nicht initialisiert ist und kein Wert dafür vorhanden ist.
Dieser Wert wird automatisch von Funktionen zurückgegeben, deren Ergebnisse nicht explizit mit dem Schlüsselwort
return
. Wenn die Funktion einen Parameter akzeptiert, der beim Aufruf nicht angegeben wird, wird er ebenfalls auf
undefined
.
Um den Wert für
undefined
zu überprüfen, können Sie die folgende Konstruktion verwenden.
typeof variable === 'undefined'
▍ Objekte
Alle Werte, die nicht primitiv sind, haben einen Objekttyp. Wir sprechen über Funktionen, Arrays, über das, was wir "Objekte" nennen, und über viele andere Entitäten. Alle diese Datentypen basieren auf dem
object
, und obwohl sie sich in vielerlei Hinsicht voneinander unterscheiden, haben sie viele Gemeinsamkeiten.
Ausdrücke
Ausdrücke sind Codefragmente, die auf der Grundlage der durchgeführten Berechnungen einen bestimmten Wert verarbeiten und erhalten können. JavaScript hat mehrere Kategorien von Ausdrücken.
Arithmetische Ausdrücke
Ausdrücke, deren Berechnungsergebnisse Zahlen sind, fallen in diese Kategorie.
1 / 2 i++ i -= 2 i * 2
String-Ausdrücke
Das Ergebnis der Auswertung solcher Ausdrücke sind Zeichenfolgen.
'A ' + 'string' 'A ' += 'string'
Primäre Ausdrücke
Literale, Konstanten und Verweise auf Bezeichner fallen in diese Kategorie.
2 0.02 'something' true false this // , undefined i // i
Dies umfasst auch einige der Schlüsselwörter und Konstruktionen von JavaScript.
function class function* // yield // / yield* // async function* // await // /pattern/i // () //
Ausdrücke für die Array- und Objektinitialisierung
[] // {} // [1,2,3] {a: 1, b: 2} {a: {b: 1}}
Logische Ausdrücke
In logischen Ausdrücken werden logische Operatoren verwendet. Das Ergebnis ihrer Berechnung sind logische Werte.
a && b a || b !a
Eigenschaftszugriffsausdrücke
Mit diesen Ausdrücken können Sie auf die Eigenschaften und Methoden von Objekten zugreifen.
object.property // ( ) object[property] object['property']
Objekterstellungsausdrücke
new object() new a(1) new MyRectangle('name', 2, {a: 4})
Funktionsdeklarationsausdrücke
function() {} function(a, b) { return a * b } (a, b) => a * b a => a * 2 () => { return 2 }
Rufen Sie Ausdrücke auf
Solche Ausdrücke werden verwendet, um Funktionen oder Methoden von Objekten aufzurufen.
ax(2) window.resize()
Mit Objekten arbeiten
Wir sind oben bereits auf Objekte gestoßen, die über Objektliterale, das Aufrufen ihrer Methoden und den Zugriff auf ihre Eigenschaften sprechen. Hier sprechen wir ausführlicher über Objekte, insbesondere den Vererbungsmechanismus des Prototyps und die Verwendung des Schlüsselworts
class
.
▍ Prototypvererbung
JavaScript zeichnet sich unter modernen Programmiersprachen dadurch aus, dass es die Vererbung von Prototypen unterstützt. Die meisten objektorientierten Sprachen verwenden ein klassenbasiertes Vererbungsmodell.
Jedes JavaScript-Objekt verfügt über eine spezielle Eigenschaft (
__proto__
), die auf ein anderes Objekt verweist, das sein Prototyp ist. Ein Objekt erbt die Eigenschaften und Methoden des Prototyps.
Angenommen, wir haben ein Objekt, das mit einem Objektliteral erstellt wurde.
const car = {}
Oder wir haben ein Objekt mit dem
Object
.
const car = new Object()
In jedem dieser Fälle ist der Prototyp des
Object.prototype
.
Wenn Sie ein Array erstellen, das auch ein Objekt ist, ist sein Prototyp ein
Array.prototype
Objekt.
const list = [] // const list = new Array()
Sie können dies wie folgt überprüfen.
car.__proto__ == Object.prototype //true car.__proto__ == new Object().__proto__ //true list.__proto__ == Object.prototype //false list.__proto__ == Array.prototype //true list.__proto__ == new Array().__proto__ //true
Hier haben wir die Eigenschaft
__proto__
. Sie muss dem Entwickler nicht zur Verfügung stehen, aber Sie können normalerweise darauf zugreifen. Es ist zu beachten, dass eine zuverlässigere Methode zum
getPrototypeOf()
eines Prototyps eines Objekts die Verwendung der Methode
getPrototypeOf()
des globalen
Object
.
Object.getPrototypeOf(new Object())
Alle Eigenschaften und Methoden des Prototyps sind für das Objekt mit diesem Prototyp zugänglich. Hier sieht zum Beispiel die Liste für ein Array aus.
Array-HinweisDer
Object.prototype
für alle Objekte ist
Object.prototype
.
Array.prototype.__proto__ == Object.prototype
Object.prototype
keinen Prototyp.
Was wir oben gesehen haben, ist ein Beispiel für eine Prototypkette.
Wenn beim Versuch, auf eine Eigenschaft oder Methode eines Objekts zuzugreifen, das Objekt selbst nicht über eine solche Eigenschaft oder Methode verfügt, werden sie in seinem Prototyp, dann im Prototyp-Prototyp usw. gesucht, bis die gewünschte gefunden wurde oder bis Die Prototypenkette wird nicht enden.
Zusätzlich zum Erstellen von Objekten mit dem
new
Operator und mit Objektliteralen oder Array-Literalen können Sie eine Instanz eines Objekts mit der
Object.create()
-Methode erstellen. Das erste Argument, das an diese Methode übergeben wird, ist ein Objekt, das zum Prototyp des damit erstellten Objekts wird.
const car = Object.create(Object.prototype)
Mit der Methode
isPrototypeOf()
können Sie überprüfen, ob ein Objekt Teil der Prototypenkette eines anderen Objekts ist.
const list = [] Array.prototype.isPrototypeOf(list)
Konstruktorfunktionen
Oben haben wir neue Objekte mit den Konstruktorfunktionen erstellt, die bereits in der Sprache verfügbar sind (wenn sie aufgerufen werden, wird das
new
Schlüsselwort verwendet). Solche Funktionen können unabhängig voneinander erstellt werden. .
function Person(name) { this.name = name } Person.prototype.hello = function() { console.log(this.name) } let person = new Person('Flavio') person.hello() console.log(Person.prototype.isPrototypeOf(person))
-. ,
this
.
name
, . . - ,
name
, .
,
name
, . , , ,
hello()
. ,
Person
hello()
( ).
▍
ES6 JavaScript «».
JavaScript . , JS . , , , « » . , , , , , .
.
class Person { constructor(name) { this.name = name } hello() { return 'Hello, I am ' + this.name + '.' } }
,
new ClassIdentifier()
.
constructor
, .
.
hello()
— , , .
Person
.
const flavio = new Person('Flavio') flavio.hello()
,
. , , , , .
, ( ) , , -, .
class Programmer extends Person { hello() { return super.hello() + ' I am a programmer.' } } const flavio = new Programmer('Flavio') flavio.hello()
hello()
Hello, I am Flavio. I am a programmer
.
(), .
super
.
, , , , , . (
static
) , .
JavaScript , (, ) . , , .
,
get
set
. — , , . -, — .
class Person { constructor(name) { this.userName = name } set name(value) { this.userName = value } get name() { return this.userName } }
Zusammenfassung
, , JavaScript. .
Liebe Leser! JS, , class.
