+49 40 608 12 460
(Development)
+49 175 5611694 (Kommunikation)
Javascript - Quiz
Mit diesem kleinen Javascript-Quiz kann jeder seine Fähigkeiten und Kenntnisse selbst testen. Er beruht auf dem Quiz von Kangax ( Perfection kills) . Wir geben zusätzlich auch die Auflösung und eine Erklärung. Das hat dann vielleicht auch einen Lerneffekt ;-)
Vielen Dank an die Mitstreiter vom Hamburger Code&Coffee und der Hamburger JS-Gruppe!
Voraussetzungen:
- Sprachlevel ist ECMAScript 3
- Jeder Schnipsel läuft im globalen Scope. Es gibt keine weiteren deklarierte Variablen.
- Die Antwort bezieht sich auf die Return-Variable oder auf das Ergebnis der letzte Zeile.
- “Error” meint einen Laufzeitfehler
Frage 1:
(function () { return typeof arguments; })();
arguments ist eine spezielle Variable und enthält die Argumente der Funktion als Array. Trotzdem liefert typeof "object", weil Arrays in Javascript auch Objekte sind.
Frage 2:
var f = function g() { return 23; }; typeof g();
Der Name der Funktion g ist nur der Funktion bekannt. Deswegen ist der Typ von g dann "undefined" . Weil undefined nicht aufgerufen werden kann, wird ein Fehler ausgelöst.
Frage 3:
(function(x){ delete x; return x; })(1);
Der Schnipsel besteht ausw einer selbstaufrufenden Funktion, die den Parameter 1 hat. Der Befehl delete löscht keine Variable, sonder hat die Aufgabe, in Literalobjekten einzelne Properties zu löschen. Wird er auf Literale angewandt, ist er wirkungslos. Deswegen ist das Ergebnis 1 .
Frage 4:
var y = 1, x = y = typeof x; x;
Entscheidend ist die Abarbeitungsreihenfolge der ersten Zeile. Zuerst wird y auf 1 gesetzt, dann x und y auf den Typ von x gesetzt. x ist zu dem Zeitpunkt aber nicht definiert. Deswegen ist x auf der letzten Zeile ebenfalls undefiniert. Der Typ von undefined ist "undefined"
Frage 5:
(function f(f) { return typeof f(); })(function () { return 1; });
Eine selbstaufrufende Funktion hat als Parameter eine Funktionsdeklaration, die bei Aufruf 1 liefern würde. In der eigentlichen Funktion wird sie aufgerufen. Das ergibt also 1 , der Typ ist "number" .
Frage 6:
var foo = { bar: function () { return this.baz; }, baz: 1 }; (function () { return typeof arguments[0](); })(foo.bar);
In der ersten Zeile wird ein Literalobjekt deklariert, wobei die erste Property eine Funktionsdeklaration darstellt. Danach wird ebendieses Objekt mit dieser Funktion aufgerufen. this bezieht sich auf den globalen Namensraum , da die Funktion nicht über new aufgerufen wurde. Deswegen is this.baz unbekannt. Der Rückgabewert ist deshalb "undefined" .
Frage 7:
var foo = { bar: function(){ return this.baz; }, baz: 1 } typeof (f = foo.bar)();
Ähnlicher wie im vorangehenden Test ist auch hier "undefined" die richtige Antwort. Allerdings wird hier die Funktion (die undefined liefert) aufgerufen und dann der Typ von undefined abgefragt, der ist "undefined" .
Frage 8:
var f = (function f() { return "1"; }, function g() { return 2; })(); typeof f;
In einer selbstaufrufenden Funktion werden zwei Funktionen deklariert. Die letzte Funktion gilt. Deswegen liefert die Funktion 2 zurück und dessen Typ ist "number" .
Frage 9:
var x = 1; if (function f(){}) { x += typeof f; } x;
f ist innerhalb der Funktion nicht bekannt. Deshalb wird innerhalb der Funktion durch Typcasting (String schlägt Number) "1undefined" .
Frage 10:
var x = [typeof x, typeof y][1]; typeof typeof x;
Wie dem auch sei: Zweimal typeof ergibt immer "string".
Frage 11:
(function (foo) { return typeof foo.bar; })({ foo: { bar: 1 } });
Hier wird eine selbstaufrufende Function mit foo.bar.1 aufgerufen. Der Parameter heisst dann fieserweise auch foo . Das soll uns nicht werwirren. foo .foo.bar gibt es nicht – deswegen ergibt das Konstrukt "undefined" .
Frage 12:
(function f() { function f() { return 1; } return f(); function f() { return 2; } })();
Innerhalb der selbstaufrufenden Funktion sind zwei Funktionsdeklarationen und ein return. Wegen des Hoistings wandert das return nach „unten“ und so ergibt sich das Resultat der letzten Funktion.
Frage 13:
function f() { return f; } new f() instanceof f;
Zuerst wird eine benamte Funktion deklariert. Dann wird sie über new mit undefined instanziiert und abgefragt, ob sie eine Instanz von f ist. Diese f ist aber undefined, dewegen false . Die Verwirrung kommt von verschieden f s, die aber nicht gleich sind.
Frage 14:
with (function(x, undefined){}) length;
Das Antipattern with verkürzt Namensräume. Es erspart dem length das Objekt, auf das es sich bezieht. Klar: 2 ist die Länge. ;-)