it-swarm.dev

Wie unterscheidet sich Pythons Umgang mit Zeilenumbrüchen von den automatischen Semikolons von JavaScript?

Javascript verfügt über eine Funktion namens Automatisches Einfügen von Semikolons. Wenn der Parser auf ein ungültiges Token stößt und das letzte Token davor ein Zeilenumbruch war, fügt der Parser ein Semikolon ein, in dem sich der Zeilenumbruch befindet. Auf diese Weise können Sie im Grunde Ihren gesamten Javascript-Code ohne Semikolons schreiben. Sie müssen jedoch einige Edge-Fälle kennen, vor allem, wenn Sie ein return-Schlüsselwort und dann den Wert haben, den Sie in einer neuen Zeile zurückgeben möchten.

function test(){
    // This will return 'undefined', because return is a valid statement
    // and  "john" is a valid statement on its own.
    return 
          "john"
}

Aufgrund dieser Fallstricke gibt es Dutzende von Artikeln mit Titeln wie "Automatisches Einfügen von Semikolons ist böse", "Verwenden Sie immer Semikolons in Javascript" usw.

Aber in Python verwendet niemand jemals Semikolons und es hat genau die gleichen Fallstricke.

def test():
    # This will return 'undefined', because return is a valid statement
    # and  "john" is a valid statement on its own.
    return 
    "john"

Funktioniert genauso, und dennoch hat niemand tödliche Angst vor Pythons Verhalten.

Ich denke, die Fälle, in denen sich das Javascript schlecht verhält, sind wenige genug, dass Sie sie leicht vermeiden können sollten. Rückgabe + Wert in einer neuen Zeile? Tun die Leute das wirklich oft?

Irgendwelche Meinungen? Verwenden Sie Semikolons in Javascript und warum?

41
Einar Egilsson

Der Grund dafür ist, dass Zeilenumbrüche in Python eine eindeutige Methode zum Trennen von Codezeilen darstellen. Dies ist beabsichtigt und die Art und Weise, wie dies funktioniert, wurde gründlich durchdacht. Infolgedessen ist python Code perfekt lesbar und eindeutig ohne spezielle End-of-Statement-Markierungen (abgesehen von der Newline).

Javascript hingegen wurde unter Berücksichtigung einer C-ähnlichen Syntax entwickelt, bei der Anweisungen immer mit einem Semikolon abgeschlossen werden. Um die Fehlertoleranz der Sprache zu erhöhen, wird versucht zu erraten, wohin zusätzliche Semikolons gehen sollen, um den Code zu korrigieren. Da dies auf die C-ähnliche Syntax nachgerüstet wurde, funktioniert es nicht immer wie erwartet (manchmal vermutet der Skriptinterpreter etwas Falsches) und kann zu ziemlich kontraintuitivem Code führen. \

Oder mit "explizit ist besser als implizit" zu argumentieren: In Python ist eine neue Zeile bereits vollständig explizit, während sie in Javascript mehrdeutig ist. Fügen Sie daher das Semikolon hinzu, um sie explizit zu machen.

62
tdammers

Ich denke, es gibt einen ziemlich grundlegenden Unterschied zu Python. Zitat aus dem Beitrag Einar Egilsson mit dem Link: "Ein Semikolon wird am Ende einer Zeile nicht impliziert, wenn das erste Token der nachfolgenden Zeile als Teil derselben Anweisung analysiert werden kann.".

In Python ein Zeilenumbruch beendet die Anweisung immer, außer in bestimmten ziemlich offensichtlichen Fällen, z. B. innerhalb eines Ausdrucks in Klammern. JavaScript hingegen versucht, so viele Zeilen wie möglich zu analysieren Beenden der Aussage, was möglicherweise zu folgenden Dingen führen kann:

// Define a function and name it area.
area = function(r) {
    return r * r * 3.14159
}

// Fooled you! We're actually invoking it.
(14)
28
Henrik

Ich minimiere meine JS-Dateien oft im Produktionsmodus. Mittel, Kommentare und Zeilenumbrüche entfernen.

Ohne die Verwendung von Semikolons würde das mein Javascript brechen.

20
Deradon

Es funktioniert nicht so, wie Sie es beschreiben.

Javascript verfügt über eine Funktion namens Automatisches Einfügen von Semikolons. Wenn der Parser auf ein ungültiges Token stößt und das letzte Token davor ein Zeilenumbruch war, fügt der Parser ein Semikolon ein, in dem sich der Zeilenumbruch befindet.

Das ist falsch. Beispiel:

return
  1 + 2;

1 ist ein vollkommen gültiges Token, aber der Parser fügt immer noch ein Semikolon direkt nach return ein.

Wie Sie sehen, können selbst Sie nicht genau sagen, wo ein Semikolon passieren wird.

Das Problem beim automatischen Einfügen ist zweierlei:

  • Zum einen können Personen ein Semikolon weglassen, bei dem das automatische Einfügen nicht bestimmen kann, dass eines eingefügt werden muss.
  • Außerdem wird möglicherweise ein Semikolon dort eingefügt, wo es nicht beabsichtigt ist, wie oben.

Die Verwendung von Semikolons nach jeder Anweisung hilft natürlich nur bei der ersten Fehlerquelle.

Wie Sie vielleicht inzwischen erraten haben, halte ich das automatische Einfügen von Semikolons in C-ähnliche Syntax für eine schlechte Idee.

5
Svante

Ich würde einen einfachen Grund nennen:

Javascript sieht "irgendwie Java-ish" oder "irgendwie C-ish" aus. Natürlich ist es eine dynamische Sprache, also sieht sie anders aus ... aber seien Sie ehrlich - Es gibt geschweifte Klammern. Sprachen mit geschweiften Klammern haben im Allgemeinen Semikolons. Die natürlichen Reflexe treten ein und lassen Ihren Finger vorher in Richtung der Semikolon-Taste gehen Sie treffen Enter.

Python sieht im Gegenteil selbst auf einen Blick völlig anders aus. Daher wird intuitiv wenig oder gar keine Analogie zu "den langweiligen Standardsprachen" gebildet, und wenn man in den "Python-Modus" wechselt, fehlt das Semikolons sind selbstverständlich.

4
Kos

Es gibt eine Reihe von guten Gründen nicht für die Verwendung der Semikolon-Einfügung in JavaScript.

Dies liegt hauptsächlich daran, dass das Einfügen von Semikolons gemäß der Definition im ECMAScript-Standard in einigen Fällen nicht intuitiv ist. @Svante weist auf einen Fall für return hin, bei dem die Verwendung von Zeilenumbrüchen Probleme verursacht.

Was er nicht erwähnt, ist, dass es Probleme verursachen wird, wenn Sie mit Semikolons verwenden, da das Einfügen von Semikolons erfolgt, ob Sie es möchten oder nicht.

Ein weiterer sehr guter Grund , die Semikoloneinfügung nicht zu verwenden, ist die Ausgabesteuerung. In vielen Fällen wird JavaScript durch einen Minifier ausgeführt, bevor es in der Produktion verwendet wird. Einige Minifahrer können automatische Semikolon-Einfügungsfälle behandeln, aber ich sehe keinen Grund, sich darauf zu verlassen, dass perfekt funktioniert

Zusätzlich kann Inline-JavaScript für Content-Management-Systeme automatisch minimiert werden, und ich habe eine Reihe von Fällen gesehen, in denen der automatische Minifier einfach Kommentare entfernt und Leerzeichen (einschließlich Zeilenumbrüche) vom Anfang und Ende jeder Zeile entfernt.

Für Autoren, die keine Wahl haben, welche Tools ausgewählt werden, ist es viel einfacher, sich an ein Format zu halten, das in den allermeisten Fällen funktioniert.

2
zzzzBov

Wenn Sie kein Semikolon verwenden, ist dies ein Fehlerrezept, wenn Sie Ihre JavaScript-Dateien minimieren. Deshalb habe ich Angst davor.

1
Eastern Monk

In Javascript können Sie ein Programm schreiben, das ohne automatische Semikolon-Einfügung syntaktisch korrekt wäre, und ASI wandelt dieses Programm in ein anderes syntaktisch korrektes Programm um (z. B. Code, der einen Wert zurückgibt) in Code, der nichts zurückgibt). In Python gibt es keinen analogen Fall. In Python jede neue Zeile, die kann eine Anweisung beenden wird eine Anweisung beenden, es sei denn, sie wird mit einem Backslash maskiert. Technisch nehme ich das an Die Regeln von Javascript sind ebenso deterministisch, aber ich weiß nicht, ob Sie die Regeln von Javascript zum Beenden von Anweisungen in einem einzigen Satz zusammenfassen könnten.

1

In den meisten Fällen behandelt die ASI von JavaScript die Dinge wie erwartet. Ein Beispiel dafür, dass sich ASI möglicherweise nicht so verhält, wie Sie es erwarten würden, ist Folgendes:

var i = 0

(function() {
   // do something
})()

Dies wird so interpretiert, dass die Funktion 0 Mit der anonymen Funktion aufgerufen und dann das Ergebnis ausgeführt wird. In diesem Fall wollten Sie wahrscheinlich eine Zuordnung vornehmen und dann sofort die anonyme Funktion ausführen.

Für jemanden, der nicht mit ASI vertraut ist, kann es sehr verwirrend sein, wenn Sie auf solche Probleme stoßen. Daher empfehle ich Entwicklern in meinem Team immer, Semikolons zu verwenden.

(Nebenbei: Ich verwende keine Semikolons, wenn ich an persönlichen/Nebenprojekten arbeite, weil ich weiß, dass niemand sonst den Code pflegen müsste.)

1
jay_soo

Wie Sie finde ich es ein bisschen paranoid. Die Regeln für das Einfügen von Semikolons sind in JavaScript genau wie in Python und CoffeeScript. Niemand wirft Python oder CoffeeScript mit Semikolons) ab. Warum also? JavaScript anders behandelt?

Ich denke, es ist eine Überreaktion auf den elenden Zustand des typischen JavaScript-Codes von vor etwa zehn Jahren - JavaScript wurde als schwache, fehlerhafte, hässliche, nicht gute Sprache angesehen. Es war eine Verlegenheit. Sie könnten unmöglich guten Code in JavaScript schreiben!

Dann kamen Leute und versuchten zu beweisen, dass Sie schönen, klaren Code in JavaScript schreiben können. Die Regel " immer Semikolons verwenden" war Teil dieser Welle. Und um ehrlich zu sein, kann es einige Situationen etwas klarer machen.

Warum wird JavaScript immer noch anders behandelt?

Es gibt Trägheit. Und es sollte nicht übersehen werden, dass Leute, die explizit strukturierten Code schätzen, oft Sprachen im C-Stil bevorzugen. Leute, die implizit strukturierten Code schätzen, wechseln oft zu Nicht-Sprachen Sprachen im C-Stil (wie CoffeeScript).

1
Closure Cowboy

Ich benutze sie in Javascript ausschließlich aus Gründen der Konsistenz. Wenn die meisten Zeilen haben

Python hat sie für Edge-Fälle wie mehrere Anweisungen in einer einzelnen Zeile, Javascript hat sie und da Sie sie regelmäßig verwenden, stimme ich der Norm zu, in der sie verwendet werden.

Ich kann keine Verwendung für mehrere Anweisungen in derselben Zeile finden und sehe daher keine Verwendung von Semikolons vor.

0
Chris

Wenn Sie für Ihre Web-App in Rails so etwas wie Bundle-Fu und Asset Manager verwenden, wird es schrecklich kaputt gehen, wenn am Ende des Tokens in Javascript kein Semikolon angezeigt wird. Es ist also eine gute Praxis, eine zu setzen.

0
subiet

Ich kann mich nicht erinnern, welche genaue Version von IE, aber es gibt einige Fälle, in denen IE wird buchstäblich einen Fehler machen, wenn ein Semikolon fehlt. IIRC ist, wenn Sie im globalen Bereich etwas haben wie:

var myFunc = function() {
  ...
}

Wenn Sie das nicht hinzufügen; Nach dem Schließen der Klammer schlägt das Programm in einigen IE-Versionen tatsächlich fehl. Dies und die anderen Gründe (einschließlich der Empfehlung von Crockford, sie immer explizit zu verwenden) haben mich veranlasst, sie in jedem Fall immer explizit zu verwenden.

0
apinstein