Dieses Kapitel ist eine Referenz für die globalen Variablen, die durch die ECMAScript-Spezifikation standardisiert wurden. Webbrowser verfügen über weitere globale Variablen, die auf MDN aufgeführt sind. Alle globalen Variablen sind (eigene oder geerbte) Eigenschaften des globalen Objekts (window in Browsern; siehe Das globale Objekt).
Details zu den folgenden Konstruktoren finden Sie in den jeweils angegebenen Abschnitten:
Array (Der Array-Konstruktor)Boolean (Wrapper-Objekte für primitive Datentypen)Date (Der Date-Konstruktor)Function (Code auswerten mit new Function())Number (Wrapper-Objekte für primitive Datentypen)Object (Jeden Wert in ein Objekt umwandeln)RegExp (Reguläre Ausdrücke erstellen)String (Wrapper-Objekte für primitive Datentypen)Details zu diesen Konstruktoren finden Sie in Fehlerkonstruktoren
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
Mehrere globale Funktionen sind keine Konstruktoren. Sie werden in diesem Abschnitt aufgeführt.
Die folgenden Funktionen behandeln mehrere Arten der URI-Kodierung und -Dekodierung:
encodeURI(uri)
Kodiert Sonderzeichen in uri prozentual. Sonderzeichen sind alle Unicode-Zeichen mit Ausnahme der folgenden:
URI-Zeichen |
|
Nicht kodiert |
|
Zum Beispiel
> encodeURI('http://example.com/Für Elise/')
'http://example.com/F%C3%BCr%20Elise/'encodeURIComponent(uriComponent)
Kodiert alle Zeichen in uriComponent prozentual, außer
Nicht kodiert |
|
Im Gegensatz zu encodeURI werden auch Zeichen kodiert, die in URLs und Dateinamen eine Rolle spielen. Sie können diese Funktion also verwenden, um beliebigen Text in einen gültigen Dateinamen oder einen URL-Pfadabschnitt umzuwandeln. Beispiel:
> encodeURIComponent('http://example.com/Für Elise/')
'http%3A%2F%2Fexample.com%2FF%C3%BCr%20Elise%2F'decodeURI(encodedURI)
Dekodiert eine durch Prozentzeichen kodierte URI, die von encodeURI erzeugt wurde.
> decodeURI('http://example.com/F%C3%BCr%20Elise/')
'http://example.com/Für Elise/'encodeURI kodiert keine URI-Zeichen, und decodeURI dekodiert sie nicht, auch wenn sie korrekt kodiert wurden.
> decodeURI('%2F')
'%2F'
> decodeURIComponent('%2F')
'/'decodeURIComponent(encodedURIComponent)
Dekodiert eine durch Prozentzeichen kodierte URI-Komponente, die von encodeURIComponent erzeugt wurde. Im Gegensatz zu decodeURI werden alle durch Prozentzeichen kodierten Zeichen dekodiert.
> decodeURIComponent('http%3A%2F%2Fexample.com%2FF%C3%BCr%20Elise%2F')
'http://example.com/Für Elise/'Die folgenden sind veraltet
escape(str) kodiert str prozentual. Es ist veraltet, da es Nicht-ASCII-Zeichen nicht korrekt behandelt. Verwenden Sie stattdessen encodeURIComponent().unescape(str) dekodiert str prozentual. Es ist veraltet, da es Nicht-ASCII-Zeichen nicht korrekt behandelt. Verwenden Sie stattdessen decodeURIComponent().Die folgenden Methoden helfen beim Kategorisieren und Parsen von Zahlen:
isFinite(number) (Auf Unendlichkeit prüfen)isNaN(value) (Fallstrick: Prüfen, ob ein Wert NaN ist)parseFloat(string) (parseFloat())parseInt(string, radix) (Ganze Zahlen mit parseInt())Dieser Abschnitt untersucht, wie Code in JavaScript dynamisch ausgewertet werden kann.
eval(str)
wertet den JavaScript-Code in str aus. Beispiel:
> var a = 12;
> eval('a + 5')
17Beachten Sie, dass eval() im Statement-Kontext parst (siehe Ausdrücke versus Anweisungen)
> eval('{ foo: 123 }') // code block
123
> eval('({ foo: 123 })') // object literal
{ foo: 123 }Für eval() sollten Sie unbedingt den Strict Mode verwenden (siehe Strict Mode). Im Sloppy Mode kann der ausgewertete Code lokale Variablen im umgebenden Geltungsbereich erstellen.
functionsloppyFunc(){eval('var foo = 123');// added to the scope of sloppyFuncconsole.log(foo);// 123}
Das kann im Strict Mode nicht passieren.
functionstrictFunc(){'use strict';eval('var foo = 123');console.log(foo);// ReferenceError: foo is not defined}
Selbst im Strict Mode hat der ausgewertete Code jedoch weiterhin Lese- und Schreibzugriff auf Variablen in umgebenden Geltungsbereichen. Um einen solchen Zugriff zu verhindern, müssen Sie eval() indirekt aufrufen.
Es gibt zwei Möglichkeiten, eval() aufzurufen:
call(), als Methode von window, indem sie unter einem anderen Namen gespeichert und dort aufgerufen wird usw.).Wie wir bereits gesehen haben, führt direkter eval()-Aufruf Code im aktuellen Geltungsbereich aus.
varx='global';functiondirectEval(){'use strict';varx='local';console.log(eval('x'));// local}
Umgekehrt führt indirekter eval()-Aufruf ihn im globalen Geltungsbereich aus.
varx='global';functionindirectEval(){'use strict';varx='local';// Don’t call eval directlyconsole.log(eval.call(null,'x'));// globalconsole.log(window.eval('x'));// globalconsole.log((1,eval)('x'));// global (1)// Change the name of evalvarxeval=eval;console.log(xeval('x'));// global// Turn eval into a methodvarobj={eval:eval};console.log(obj.eval('x'));// global}
Erläuterung von (1): Wenn Sie über den Namen auf eine Variable zugreifen, ist das erste Ergebnis eine sogenannte Referenz, eine Datenstruktur mit zwei Hauptfeldern:
base zeigt auf die Umgebung, die Datenstruktur, in der der Wert der Variablen gespeichert ist.referencedName ist der Name der Variablen.Während eines eval()-Funktionsaufrufs stößt der Funktionsaufrufoperator (die Klammern) auf eine Referenz auf eval und kann den Namen der aufzurufenden Funktion ermitteln. Daher löst ein solcher Funktionsaufruf einen direkten eval()-Aufruf aus. Sie können jedoch einen indirekten eval()-Aufruf erzwingen, indem Sie dem Aufrufoperator keine Referenz geben. Dies wird erreicht, indem der Wert der Referenz abgerufen wird, bevor der Operator angewendet wird. Der Kommaoperator erledigt dies für uns in Zeile (1). Dieser Operator wertet den ersten Operanden aus und gibt das Ergebnis der Auswertung des zweiten Operanden zurück. Die Auswertung erzeugt immer Werte, was bedeutet, dass Referenzen aufgelöst und Funktionsnamen verloren gehen.
Indirekt ausgewerteter Code ist immer Sloppy. Das ist eine Folge davon, dass der Code unabhängig von seiner aktuellen Umgebung ausgewertet wird.
functionstrictFunc(){'use strict';varcode='(function () { return this }())';varresult=eval.call(null,code);console.log(result!==undefined);// true, sloppy mode}
Der Konstruktor Function() hat die Signatur:
newFunction(param1,...,paramN,funcBody)
Erstellt eine Funktion, deren null oder mehr Parameter die Namen param1, param2 usw. haben und deren Körper funcBody ist; das heißt, die erstellte Funktion sieht so aus:
function(«param1»,...,«paramN»){«funcBody»}
Verwenden wir new Function(), um eine Funktion f zu erstellen, die die Summe ihrer Parameter zurückgibt.
> var f = new Function('x', 'y', 'return x+y');
> f(3, 4)
7Ähnlich wie indirektes eval(), erstellt new Function() Funktionen, deren Geltungsbereich global ist:[18]
varx='global';functionstrictFunc(){'use strict';varx='local';varf=newFunction('return x');console.log(f());// global}
Solche Funktionen sind standardmäßig ebenfalls Sloppy.
functionstrictFunc(){'use strict';varsl=newFunction('return this');console.log(sl()!==undefined);// true, sloppy modevarst=newFunction('"use strict"; return this');console.log(st()===undefined);// true, strict mode}
Normalerweise ist es besser, new Function() anstelle von eval() zu verwenden, um Code auszuwerten: Die Funktionsparameter bieten eine klare Schnittstelle zum ausgewerteten Code, und Sie benötigen nicht die leicht umständliche Syntax des indirekten eval(), um sicherzustellen, dass der ausgewertete Code nur auf globale Variablen (zusätzlich zu seinen eigenen) zugreifen kann.
Sie sollten eval() und new Function() vermeiden. Das dynamische Auswerten von Code ist langsam und birgt potenzielle Sicherheitsrisiken. Es verhindert auch, dass die meisten Tools (wie IDEs), die statische Analysen verwenden, den Code berücksichtigen.
Oft gibt es bessere Alternativen. Brendan Eich hat zum Beispiel kürzlich einen Antipattern getwittert, der von Programmierern verwendet wird, die auf eine Eigenschaft zugreifen möchten, deren Name in einer Variablen propName gespeichert ist.
varvalue=eval('obj.'+propName);
Die Idee ist sinnvoll: Der Punktoperator unterstützt nur feste, statisch bereitgestellte Eigenschaftsschlüssel. In diesem Fall ist der Eigenschaftsschlüssel nur zur Laufzeit bekannt, weshalb eval() benötigt wird, um diesen Operator zu verwenden. Glücklicherweise verfügt JavaScript auch über den Klammeroperator, der dynamische Eigenschaftsschlüssel akzeptiert. Daher ist die folgende ein bessere Version des vorherigen Codes:
varvalue=obj[propName];
Sie sollten eval() oder new Function() auch nicht zum Parsen von JSON-Daten verwenden. Das ist unsicher. Verlassen Sie sich entweder auf die integrierte JSON-Unterstützung von ECMAScript 5 (siehe Kapitel 22) oder verwenden Sie eine Bibliothek.
Es gibt einige legitime, wenn auch fortgeschrittene, Anwendungsfälle für eval() und new Function(): Konfigurationsdaten mit Funktionen (was JSON nicht erlaubt), Vorlagenbibliotheken, Interpreter, Befehlszeilen und Modulsysteme.
Dies war ein relativ umfassender Überblick über die dynamische Auswertung von Code in JavaScript. Wenn Sie tiefer eintauchen möchten, können Sie sich den Artikel „Global eval. What are the options?“ von kangax ansehen.
Dieser Abschnitt bietet einen Überblick über die Console API. Er dokumentiert den Status Quo ab Chrome 32, Firebug 1.12, Firefox 25, Internet Explorer 11, Node.js 0.10.22 und Safari 7.0.
Die Implementierungen der Console API variieren stark und ändern sich ständig. Wenn Sie eine autoritative Dokumentation wünschen, haben Sie zwei Möglichkeiten. Erstens können Sie sich standardähnliche Übersichten der API ansehen:
Zweitens können Sie sich die Dokumentation verschiedener Engines ansehen
Es gibt einen Bug in Internet Explorer 9. In diesem Browser existiert das console-Objekt nur, wenn die Entwicklertools mindestens einmal geöffnet waren. Das bedeutet, dass Sie einen ReferenceError erhalten, wenn Sie sich auf console beziehen und die Tools zuvor nicht geöffnet waren. Als Workaround können Sie prüfen, ob console existiert und bei Bedarf eine Dummy-Implementierung erstellen.
Die Console API enthält die folgenden Logging-Methoden:
console.clear()
console.debug(object1, object2?, ...)
console.log(), was dasselbe tut wie diese Methode.console.error(object1, object2?, ...)
console.exception(errorObject, object1?, ...]) [Nur Firebug]object1 usw. und zeigt einen interaktiven Stacktrace an.console.info(object1?, object2?, ...)
console.log(object1?, object2?, ...)
Protokolliert die Parameter in der Konsole. Wenn der erste Parameter eine printf-ähnliche Formatzeichenkette ist, verwenden Sie diese, um die restlichen Parameter auszugeben. Beispiel (Node.js REPL):
> console.log('%s', { foo: 'bar' })
[object Object]
> console.log('%j', { foo: 'bar' })
{"foo":"bar"}Die einzige verlässliche plattformübergreifende Formatierungsdirektive ist %s. Node.js unterstützt %j zur Formatierung von Daten als JSON; Browser unterstützen tendenziell Direktiven, die etwas Interaktives in der Konsole protokollieren.
console.trace()
console.warn(object1?, object2?, ...)
Die Unterstützung auf verschiedenen Plattformen ist in der folgenden Tabelle angegeben:
| Chrome | Firebug | Firefox | IE | Node.js | Safari | |
| ✓ | ✓ | ✓ | ✓ | ||
| ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | |||||
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
exception wurde kursiv gesetzt, da es nur auf einer einzigen Plattform unterstützt wird.
Die Console API enthält die folgenden Prüf- und Zählmethoden:
console.assert(expr, obj?)
expr false ist, wird obj in der Konsole protokolliert und eine Ausnahme ausgelöst. Wenn es true ist, passiert nichts.console.count(label?)
Die Unterstützung auf verschiedenen Plattformen ist in der folgenden Tabelle angegeben:
| Chrome | Firebug | Firefox | IE | Node.js | Safari | |
| ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ |
Die Console API enthält die folgenden Methoden für formatiertes Logging:
console.dir(object)
console.dirxml(object)
console.group(object1?, object2?, ...)
console.groupEnd() aufrufen. Der Block ist zunächst erweitert, kann aber auch reduziert werden.console.groupCollapsed(object1?, object2?, ...)
console.group(), aber der Block ist anfangs reduziert.console.groupEnd()
console.group() oder console.group Collapsed() geöffnet wurde.console.table(data, columns?)
Gibt ein Array als Tabelle aus, ein Element pro Zeile. Der optionale Parameter columns gibt an, welche Eigenschaften/Array-Indizes in den Spalten angezeigt werden. Wenn dieser Parameter fehlt, werden alle Eigenschaftsschlüssel als Tabellenspalten verwendet. Fehlende Eigenschaften und Array-Elemente erscheinen als undefined in den Spalten.
varpersons=[{firstName:'Jane',lastName:'Bond'},{firstName:'Lars',lastName:'Croft',age:72}];// Equivalent:console.table(persons);console.table(persons,['firstName','lastName','age']);
Die resultierende Tabelle sieht wie folgt aus:
| (index) | firstName | lastName | age |
0 | „Jane“ | „Bond“ | undefined |
1 | „Lars“ | „Croft“ | 72 |
Die Unterstützung auf verschiedenen Plattformen ist in der folgenden Tabelle angegeben:
| Chrome | Firebug | Firefox | IE | Node.js | Safari | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ||
| ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | |
| ✓ | ✓ |
Die Console API enthält die folgenden Methoden für Profiling und Zeitmessung:
console.markTimeline(label) [Nur Safari]console.timeStamp.console.profile(title?)
title wird für den Profilbericht verwendet.console.profileEnd()
console.time(label)
label.console.timeEnd(label)
label und gibt die seit dem Start verstrichene Zeit aus.console.timeStamp(label?)
label. Kann in der Konsole oder einer Zeitachse protokolliert werden.Die Unterstützung auf verschiedenen Plattformen ist in der folgenden Tabelle angegeben:
| Chrome | Firebug | Firefox | IE | Node.js | Safari | |
| ✓ | |||||
| ✓ | ✓ | (devtools) | ✓ | ✓ | |
| ✓ | ✓ | (devtools) | ✓ | ✓ | |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| ✓ | ✓ |
markTimeline wurde kursiv gesetzt, da es nur auf einer einzigen Plattform unterstützt wird. Die Bezeichnung (devtools) bedeutet, dass die Entwicklertools geöffnet sein müssen, damit die Methode funktioniert.[19]
Die folgenden globalen Variablen dienen als Namensräume für Funktionen. Details finden Sie im in Klammern angegebenen Material:
JSON
Math
Object
Die folgenden globalen Variablen enthalten spezielle Werte. Für weitere Informationen lesen Sie das in Klammern angegebene Material:
undefined
Ein Wert, der ausdrückt, dass etwas nicht existiert (undefined und null)
> ({}.foo) === undefined
trueNaN
Ein Wert, der ausdrückt, dass etwas „keine Zahl“ ist (NaN)
> 1 / 'abc' NaN
Infinity
Ein Wert, der die numerische Unendlichkeit ∞ bezeichnet (Infinity)
> 1 / 0 Infinity