+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:

  1. Sprachlevel ist ECMAScript 3
  2. Jeder Schnipsel läuft im globalen Scope. Es gibt keine weiteren deklarierte Variablen.
  3. Die Antwort bezieht sich auf die Return-Variable oder auf das Ergebnis der letzte Zeile.
  4. “Error” meint einen Laufzeitfehler

Frage 1:

 (function () {
     return typeof arguments;
 })();

“object”

“array”

“arguments”

“undefined”

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();

“number”

“undefined”

“function”

Error

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);

1

null

undefined

Error

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;

1

"number

undefined

"undefined"

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;
});

"number"

"undefined"

"function"

Error

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);

"undefined"

"object"

"number"

"function"

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)();

"object"

"number"

"undefined"

"function"

Ä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;

"string"

"number"

"function"

"undefined"

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;

"1function"

"1"

"1undefined"

"NaN"

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;

"number"

"string"

"undefined"

"object"

Wie dem auch sei: Zweimal typeof ergibt immer "string".

Frage 11:

(function (foo) {
    return typeof foo.bar;
})({
    foo: {
        bar: 1
    }
});

"undefined"

"object"

"number"

Error

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;
    }
})();

1

2

undefined

Error

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;

true

false

undefined

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;

1

2

undefined

NaN

Das Antipattern with verkürzt Namensräume. Es erspart dem length das Objekt, auf das es sich bezieht. Klar: 2  ist die Länge. ;-)