Es ist allen bekannt, dass die Syntax von JavaScript so erbärmlich ist.
Lassen Sie uns zuerst ein Bild aufstellen
Der Code ist wie folgt:
Die Codekopie lautet wie folgt:
{} + []; // 0
[] + {}; // "[Objektobjekt]"
{} + [] == [] + {}; // FALSCH
({} + [] == [] + {}); // WAHR
Eine so schmerzhafte Syntax -Fallstrick ist wahrscheinlich nur eine seltsame Sache wie JavaScript.
Ich glaube, dass die meisten Kinderschuhe, die JavaScript -Compiler nicht studieren, überhaupt nicht verstanden werden können. (Zumindest finde ich es unglaublich)
Später ging ich eine Weile zum Baidu -Mädchen und merkte es dann plötzlich!
Schauen wir uns diesen Code an:
Die Codekopie lautet wie folgt:
{
A: 1
}
Ich glaube, dass die meisten Kinderschuhe denken werden, dass dies eine direkte Messung des Objekts auf den ersten Blick ist.
Was ist mit diesem Code?
Die Codekopie lautet wie folgt:
{
var a = 1;
}
Wird der Browser nach Syntaxfehlern einführen?
Offensichtlich nicht! Wenn Sie sorgfältig darüber nachdenken, werden wir verstehen, dass dies ein Statement -Block ist.
Die Codekopie lautet wie folgt:
if (isNumber) {
var a = 1;
}
Apropos, Sie haben vielleicht festgestellt, dass JavaScript mit {.
Wie geht der JavaScript -Compiler mit dieser Mehrdeutigkeit um?
Um dieses Problem zu lösen, ist die Methode von ECMA sehr einfach und grob: Wenn die Syntax analysiert wird, wird bei einer Aussage mit "{" nur als Anweisungsblock interpretiert.
Das ist wirklich ein betrügerischer Weg!
Warum hat {a: 1} keine Syntaxfehler?
Tatsächlich wird hier A vom Parser als Tag verstanden. Tags werden verwendet, um die Break zu entsprechen und Anweisungen für direkte Sprünge fortzusetzen.
Daher stellt eine solche Schreibmethode eine Ausnahme aus:
Die Codekopie lautet wie folgt:
{
A: function () {}
}
Da function () {} keine Funktionserklärung ist, ist es auch kein Funktionsausdruck.
Zu diesem Zeitpunkt sollte jeder ein grundlegendes Konzept der seltsamen Behandlung von {} haben. Schauen wir uns die wenigen Sätze zurück, die zu Beginn des Artikels erwähnt wurden:
Die Codekopie lautet wie folgt:
{} + []; // 0
[] + {}; // "[Objektobjekt]"
{} + [] == [] + {}; // FALSCH
({} + [] == [] + {}); // WAHR
Der erste, weil {} ein Anweisungsblock ist, kann der Code als:
Die Codekopie lautet wie folgt:
if (1) {}
+[]
Der Rückgabewert ist also 0.
Zweitens, da sich {} nicht am Anfang der Anweisung befindet, handelt es sich um eine normale Objekt direkte Menge, das leere Array und das leere Objekt werden direkt hinzugefügt und "[Objekt]" wird zurückgegeben.
Ich verstehe die ersten und zweiten Artikel, aber es besteht keine Notwendigkeit, den dritten Artikel zu erklären.
Artikel 4, weil es mit () beginnt, wird der erste {} in die direkte Menge des Objekts analysiert, sodass die beiden Formeln gleich sind und wahr zurückgeben.