In che modo la gestione delle interruzioni di riga di Python differisce dal punto e virgola automatico di JavaScript?

41

Javascript ha una funzione chiamata Inserimento automatico di un punto e virgola, in cui, in pratica, se il parser incontra un token non valido e l'ultimo token prima dell'intervallo di riga, il parser inserisce un punto e virgola in corrispondenza dell'interruzione di riga. Ciò ti consente di scrivere praticamente tutto il codice javascript senza punto e virgola, ma devi essere a conoscenza di alcuni casi limite, principalmente se hai una parola chiave di ritorno e poi il valore che vuoi restituire su una nuova riga.

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

A causa di questi trucchi ci sono dozzine di articoli con titoli come "Inserimento automatico punto e virgola è Evil", "Usa sempre punto e virgola in Javascript" ecc.

Ma in Python nessuno usa mai il punto e virgola e ha esattamente gli stessi trucchi.

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

Funziona esattamente allo stesso modo, eppure nessuno ha paura mortale del comportamento dei pitoni.

Penso che i casi in cui il javascript si comporta male sono abbastanza pochi da poterli evitare facilmente. Ritorna + valore su una nuova riga? Le persone lo fanno davvero tanto?

Qualche opinione? Utilizzi il punto e virgola in javascript e perché?

    
posta Einar Egilsson 07.08.2011 - 15:33
fonte

13 risposte

62

La ragione è che in Python, i newline sono un modo inequivocabile di separare le code line; questo è in base alla progettazione e il modo in cui funziona è stato accuratamente studiato. Di conseguenza, il codice Python è perfettamente leggibile e non ambiguo senza alcun marcatore speciale di fine istruzione (a parte la nuova riga).

Javascript, d'altra parte, è stato progettato con una sintassi simile a C, in cui le istruzioni vengono sempre terminate con un punto e virgola. Per rendere la lingua più tollerante agli errori, cerca di indovinare dove inserire il punto e virgola in più per rendere corretto il codice. Dal momento che questo era un po 'retro-montato sulla sintassi C-like, non sempre funziona come previsto (a volte, l'interprete dello script indovina male), e può rendere il codice abbastanza contro-intuitivo. \

Oppure, argomentando in termini di "esplicito è meglio di implicito": in Python, una nuova riga è già completamente esplicita, mentre in Javascript è ambigua, quindi aggiungi il punto e virgola per renderlo esplicito.

    
risposta data 07.08.2011 - 15:53
fonte
28

Credo che ci sia una differenza piuttosto fondamentale nel modo in cui funziona in Python. Citando il post Einar Egilsson collegato a: "un punto e virgola non è implicito alla fine di una riga se il primo token della riga successiva può essere analizzato come parte della stessa istruzione".

In Python un'interruzione di riga termina sempre l'istruzione, tranne in alcuni casi abbastanza ovvi come all'interno di un'espressione tra parentesi. JavaScript, d'altra parte, cercherà di analizzare tutte le linee che possono prima di terminare l'istruzione, portando potenzialmente a cose come questa:

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

// Fooled you! We're actually invoking it.
(14)
    
risposta data 07.08.2011 - 20:09
fonte
20

Spesso minimizzo i miei file JS in modalità di produzione. Mezzi, rimozione di commenti e interruzioni di riga.

Senza l'uso del punto e virgola, ciò spezzerebbe il mio Javascript.

    
risposta data 07.08.2011 - 15:50
fonte
5

Non funziona come descrivi.

Javascript has a feature called Automatic Semicolon Insertion where basically if the parser encounters an invalid token, and the last token before that was a line break, then the parser will insert a semicolon where the linebreak is.

Questo è sbagliato. Esempio:

return
  1 + 2;

1 è un token perfettamente valido, ma il parser inserirà ancora un punto e virgola direttamente dopo return .

Come vedi, anche tu non puoi dire esattamente dove avverrà un punto e virgola.

Il problema con l'inserimento automatico è duplice:

  • Per uno, le persone potrebbero lasciare un punto e virgola in cui l'inserimento automatico non può determinare che è necessario inserirlo.
  • Inoltre, un punto e virgola potrebbe essere inserito dove non è destinato, come sopra.

Ovviamente, usare il punto e virgola dopo ogni istruzione aiuta solo con la prima fonte di errori.

In ogni caso, come puoi immaginare, credo che l'inserimento automatico del punto e virgola nella sintassi C-like sia una cattiva idea.

    
risposta data 07.08.2011 - 17:59
fonte
4

Direi una semplice ragione:

Javascript sembra "kinda java-ish" o "kinda C-ish". Ovviamente è un linguaggio dinamico, quindi sembra diverso ... ma affrontalo - Ci sono parentesi graffe. Le lingue con parentesi graffe hanno in genere il punto e virgola. I riflessi naturali entrano in azione e fanno scorrere il dito verso il punto e virgola prima di premere Invio .

Python, al contrario, anche a colpo d'occhio sembra completamente diverso. Quindi, l'analogia minima o inesistente con "i linguaggi noiosi standard" è intuitivamente formata e quando si entra nella "modalità python", la mancanza di punto e virgola è naturale.

    
risposta data 07.08.2011 - 20:44
fonte
2

Esistono numerosi buoni motivi non per utilizzare l'inserimento del punto e virgola in JavaScript.

Principalmente perché l'inserimento di punti e virgola come definito nello standard ECMAScript non è intuitivo per alcuni casi. @Svante indica un caso per return in cui l'utilizzo di newline causerà problemi.

Ciò che non menziona è che causerà problemi se usi utilizzando anche i semi-colon, perché l'inserimento del punto e virgola avviene se lo vuoi o no.

Un altro ottimo motivo non per usare l'inserimento del punto e virgola è il controllo dell'output. In molti casi, JavaScript viene eseguito tramite un minificatore prima di essere utilizzato nella produzione. Alcuni minificatori possono gestire casi di inserimento automatico del punto e virgola, ma non vedo alcun motivo per cui contare funzioni perfettamente

Inoltre, per i sistemi di gestione dei contenuti, JavaScript inline può essere auto-minificato e ho visto un certo numero di casi in cui l'auto-minatore rimuove semplicemente i commenti e taglia gli spazi bianchi (incluse le nuove linee) dall'inizio e dalla fine di ogni riga.

Per gli autori che non hanno una scelta su quali strumenti vengono scelti, è molto più semplice limitarsi a un formato che funziona nella maggior parte dei casi.

    
risposta data 07.08.2011 - 18:25
fonte
1

Non usare il punto e virgola è una ricetta per errori quando si minimizzano i file JavaScript dei file. Ecco perché ne ho paura.

    
risposta data 07.08.2011 - 18:24
fonte
1

In Javascript, puoi scrivere un programma che sarebbe sintatticamente corretto in assenza dell'inserimento automatico del punto e virgola, e ASI trasformerà quel programma in un programma sintatticamente corretto diverso (ad esempio, trasformando il codice che restituisce un valore in codice che non restituisce nulla). Non esiste un caso analogo in Python. In Python qualsiasi nuova riga che può terminare un'istruzione farà terminare un'istruzione, a meno che non sia sfuggita con una barra rovesciata. Tecnicamente, suppongo che le regole di Javascript siano ugualmente deterministiche, ma non so se potresti riassumere le regole di Javascript per le dichiarazioni finali in una singola frase.

    
risposta data 07.08.2011 - 19:43
fonte
1

Nella maggior parte dei casi, l'ASI di JavaScript gestisce le cose come previsto. Un esempio di ASI forse non si comporta come ci si aspetterebbe da questo:

var i = 0

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

Questo sarà interpretato come chiamando la funzione 0 con la funzione anonima, quindi eseguendo il risultato. In questo caso, probabilmente hai voluto eseguire un compito, quindi eseguire immediatamente la funzione anonima.

Per qualcuno che non ha familiarità con ASI può essere molto confuso quando si incontrano problemi come questo, quindi consiglio sempre agli sviluppatori del mio team di usare il punto e virgola.

(Per inciso: non uso il punto e virgola quando lavoro su progetti personali / secondari perché so che nessun altro avrebbe bisogno di mantenere il codice.)

    
risposta data 07.08.2011 - 20:39
fonte
1

Come te, penso che sia un po 'paranoico. Le regole per l'inserimento del punto e virgola sono ben definite in JavaScript, così come sono in Python e CoffeeScript. Nessuno riproduce Python o CoffeeScript con punto e virgola, quindi perché JavaScript viene trattato in modo diverso?

Penso che sia una reazione eccessiva allo stato miserabile del tipico codice JavaScript di circa dieci anni fa: JavaScript è stato visto come un linguaggio debole, buggato, brutto, non buono. Era un imbarazzo. Non è possibile scrivere un buon codice in JavaScript!

Poi, la gente è arrivata e ha cercato di dimostrare che potrebbe scrivere codice bello e chiaro in JavaScript. La regola " sempre usa punto e virgola" faceva parte di questa ondata. E per essere onesti, può rendere alcune situazioni un po 'più chiare.

Perché JavaScript è ancora trattato in modo diverso?

C'è inerzia. E non va dimenticato che le persone che apprezzano il codice esplicitamente strutturato spesso preferiscono i linguaggi in stile C. le persone che apprezzano il codice implicitamente strutturato spesso passano in linguaggi non in stile C (come CoffeeScript).

    
risposta data 07.08.2011 - 20:58
fonte
0

Li uso in Javascript rigorosamente per coerenza. Se la maggior parte delle linee ha

Python li ha per casi limite come più istruzioni su una singola riga, javascript li ha e poiché li si trova regolarmente utilizzati sono conformi alla norma in cui vengono utilizzati.

Non riesco a trovare un utilizzo per più istruzioni sulla stessa riga e quindi non prevedo l'utilizzo del punto e virgola.

    
risposta data 07.08.2011 - 15:38
fonte
0

Se utilizzi qualcosa come bundle-fu e asset manager per la tua app web in binari, si romperà in modo orribile se non incontra un punto e virgola alla fine del token in javascript. Quindi è una buona pratica metterne uno.

    
risposta data 07.08.2011 - 17:45
fonte
0

Non riesco a ricordare quale versione esatta di IE, ma ci sono alcuni casi in cui IE letteralmente errore se manca un punto e virgola. IIRC è quando hai nell'ambito globale qualcosa del tipo:

var myFunc = function() {
  ...
}

Se non aggiungi il; dopo la parentesi di chiusura, il programma fallirà effettivamente su alcune versioni di IE. Questo, insieme agli altri motivi (inclusa la raccomandazione di Crockford di usarli sempre esplicitamente) mi ha portato ad usarli sempre esplicitamente in ogni caso.

    
risposta data 07.08.2011 - 20:51
fonte

Leggi altre domande sui tag