Ich war heute sehr überrascht, als dieser Code verursachte
%Vor%Offensichtlich funktioniert das automatische JavaScript-Semikolon-Einfügen von JavaScript hier nicht wie erwartet. Aber warum?
Ich weiß, dass Sie empfehlen könnten, ;
überall zu verwenden, um so etwas zu vermeiden, aber die Frage ist nicht, ob es besser ist, ;
zu verwenden oder nicht. Ich würde gerne wissen, was genau hier passiert?
Wenn ich mir Gedanken über die Semikolon-Einfügung mache, denke ich darüber nach, wie die betreffenden Zeilen ohne Leerzeichen aussehen würden. In Ihrem Fall wäre das:
%Vor% Hier sagen Sie der Javascript-Engine, dass sie console.log
mit der Länge von [a,b]
aufruft, und dann den Index [a,b]
des Ergebnisses dieses Aufrufs.
console.log
gibt eine Zeichenfolge zurück, sodass Ihr Code versucht, die Eigenschaft b
dieser Zeichenfolge zu finden, die nicht definiert ist und der Aufruf von undefined.some()
fehlschlägt.
Es ist interessant zu bemerken, dass str[a,b]
in str[b]
aufgelöst wird, wobei angenommen wird, dass str eine Zeichenkette ist. Wie Kamil bemerkt, ist a,b
ein gültiger Javascript-Ausdruck und das Ergebnis dieses Ausdrucks ist einfach b
.
Im Allgemeinen könnte man sagen, dass implizite Semikolons leicht versagen können, wenn ein Array in einer neuen Zeile definiert wird, da ein Array, das in einer neuen Zeile definiert ist, als Eigenschaftszugriff auf den Wert des Ausdrucks in der vorherigen Zeile interpretiert wird .
Javascript berücksichtigt nur neue Zeilen, um das Ende einer Anweisung zu markieren, wenn nicht die Anweisung beendet, nachdem diese neue Zeile einen Syntaxfehler verursacht hat. Siehe Welche Regeln gelten für die automatische Semikolon-Einfügung von JavaScript (ASI )? und EcmaScript 5 Spezifikationen für die genauen Regeln. (Dank Rob W und Rampenlicht)
Was passiert, ist folgendes:
Der Code wird als
interpretiert %Vor%d. alles als eine Aussage.
Parsen Sie jetzt die Aussage:
some
wird für den Wert von console.log([a,b].length)[a,b]
Der Wert von console.log([a,b].length)[a,b]
wird berechnet, indem der zurückgegebene Wert von console.log([a,b].length)
( undefined
) verwendet wird und dann versucht wird, auf die Eigenschaft mit dem Namen des Werts von a,b
zuzugreifen.
a,b
ergibt den Wert von b
(versuchen Sie es in Ihrer Konsole). Es gibt keine Eigenschaft mit dem Wert b
von undefined
. Der resultierende Wert ist also auch undefined
.
Es gibt keine Methode some
auf undefined
, daher der Fehler.
JavaScript behandelt nicht jeden Zeilenumbruch als Semikolon. Es behandelt normalerweise Linie bricht als Semikolon nur ab, wenn der Code ohne Semikolon nicht analysiert werden kann. Grundsätzlich behandelt JavaScript einen Zeilenumbruch als Semikolon, wenn das nächste Zeichen, das kein Leerzeichen ist, nicht als Fortsetzung der aktuellen Anweisung interpretiert werden kann. JavaScript - The Definitive Guide: 6. Ausgabe . Abschnitt 2.4
Also, in Ihrem Fall interpretiert es die Zeile als etwas wie
%Vor% Und das ist der Grund für einen Fehler. JavaScript versucht, Array-Zugriff auf die Ergebnisse von console.log([a,b].length)
durchzuführen. Abhängig von der JavaScript-Engine und dem Rückgabewert von console.log
können verschiedene Fehler auftreten.
Tags und Links javascript arrays semicolon