Sono necessari i punti e virgola dopo l’assegnazione letterale dell’object in JavaScript?

Il seguente codice illustra un object letterale assegnato, ma senza punto e virgola in seguito:

var literal = { say: function(msg) { alert(msg); } } literal.say("hello world!"); 

Questo sembra essere legale e non emette alcun avvertimento (almeno in Firefox 3). È completamente legale o esiste una versione rigida di JavaScript in cui ciò non è consentito?

Mi chiedo in particolare per i futuri problemi di compatibilità … Mi piacerebbe scrivere JavaScript “corretto”, quindi se tecnicamente ho bisogno di usare il punto e virgola, mi piacerebbe usarlo.

Non tecnicamente, JavaScript ha il punto e virgola come opzionale in molte situazioni.

Ma, come regola generale, usali alla fine di ogni affermazione. Perché? Perché se vuoi comprimere lo script, ti salverà da innumerevoli ore di frustrazione.

L’inserimento automatico del punto e virgola viene eseguito dall’interprete, quindi puoi lasciarlo fuori se lo desideri. Nei commenti, qualcuno ha affermato che

I punti e virgola non sono opzionali con istruzioni come break / continue / throw

ma questo non è corretto. Sono opzionali; ciò che sta realmente accadendo è che i terminatori di riga influenzano l’inserimento automatico del punto e virgola; è una sottile differenza.

Ecco il resto dello standard sull’inserimento punto e virgola:

Per comodità, tuttavia, tali punti e virgola possono essere omessi dal testo sorgente in determinate situazioni. Queste situazioni sono descritte dicendo che i punti e virgola vengono automaticamente inseriti nel stream di codice del codice sorgente in tali situazioni.

Il compressore YUI e il dojo shrink safe dovrebbero funzionare perfettamente senza punto e virgola poiché sono basati su un parser JavaScript completo. Ma Packer e JSMin no.

L’altro motivo per utilizzare sempre i punti e virgola alla fine delle dichiarazioni è che occasionalmente è ansible combinare accidentalmente due istruzioni per creare qualcosa di molto diverso. Ad esempio, se si segue l’istruzione con la tecnica comune per creare un ambito utilizzando una chiusura:

 var literal = { say: function(msg) { alert(msg); } } (function() { // .... })(); 

Il parser potrebbe interpretare le parentesi come una chiamata di funzione, causando qui un errore di tipo, ma in altre circostanze potrebbe causare un bug sottile che è difficile da tracciare. Un altro inconveniente interessante è che se la prossima istruzione inizia con un’espressione regolare, il parser potrebbe pensare che la prima barra in avanti sia un simbolo di divisione.

Gli interpreti JavaScript fanno qualcosa chiamato “inserimento punto e virgola”, quindi se una riga senza punto e virgola è valida, verrà aggiunto un punto e virgola alla fine dell’istruzione e non si verificherà alcun errore.

 var foo = 'bar' // Valid, foo now contains 'bar' var bas = { prop: 'yay!' } // Valid, bas now contains object with property 'prop' containing 'yay!' var zeb = switch (zeb) { ... // Invalid, because the lines following 'var zeb =' aren't an assignable value 

Non troppo complicato e almeno un errore viene generato quando qualcosa non è chiaramente giusto. Tuttavia, in alcuni casi non viene generato un errore, ma le istruzioni non vengono eseguite come previsto a causa dell’inserimento punto e virgola. Considera una funzione che dovrebbe restituire un object:

 return { prop: 'yay!' } // The object literal gets returned as expected and all is well return { prop: 'nay!' } // Oops! return by itself is a perfectly valid statement, so a semicolon // is inserted and undefined is unexpectedly returned, rather than the object // literal. Note that no error occurred. 

Bug come questo possono essere incredibilmente difficili da cacciare e mentre non puoi garantire che ciò non accada mai (poiché non c’è modo di sapere per distriggersre l’inserimento del punto e virgola), questi tipi di bug sono più facili da identificare quando rendi chiare le tue intenzioni costantemente usando il punto e virgola. Questo, aggiungendo esplicitamente il punto e virgola, è generalmente considerato di buon gusto.

Sono stato informato per la prima volta di questa insidiosa possibilità quando ho letto il libro superbo e succinto di Douglas Crockford ” JavaScript: The Good Parts “. Lo consiglio vivamente .

In questo caso non è necessario un punto e virgola alla fine dell’istruzione. La conclusione è la stessa, ma il ragionamento è lontano.

JavaScript non ha il punto e virgola come “opzionale”. Piuttosto, ha regole rigide sull’inserimento automatico del punto e virgola. I punti e virgola non sono opzionali con istruzioni come break , continue o throw . Fare riferimento alle specifiche della lingua ECMA per maggiori dettagli; in particolare 11.9.1, regole per l’inserimento automatico del punto e virgola .

Usa JSLint per mantenere il tuo JavaScript pulito e ordinato

JSLint dice:

Errore:

Implied global: alert 2

Problema alla riga 3 carattere 2: punto e virgola mancante.

}

Il punto e virgola non è necessario. Alcune persone scelgono di seguire la convenzione di terminare sempre con un punto e virgola invece di consentire a JavaScript di farlo automaticamente in caso di interruzione di riga, ma sono sicuro che troverai gruppi che sostengono entrambe le direzioni.

Se stai cercando di scrivere JavaScript “corretto”, ti suggerirei di testare le cose in Firefox con javascript.options.strict (accessibile tramite about:config ) impostato su true. Potrebbe non catturare tutto, ma dovrebbe aiutarti a garantire che il tuo codice JavaScript sia più conforms.

Questo non è valido (vedi il chiarimento sotto) codice JavaScript, dal momento che l’assegnazione è solo una dichiarazione regolare, non diversa da

 var foo = "bar"; 

Il punto e virgola può essere omesso poiché gli interpreti JavaScript tentano di aggiungere un punto e virgola per correggere gli errori di syntax, ma questo è un passaggio aggiuntivo e non necessario. Non conosco alcuna modalità rigorosa, ma so che parser automatici o compressori / occlusioni hanno bisogno di quel punto e virgola.

Se vuoi scrivere correttamente il codice JavaScript, scrivi il punto e virgola 🙂

In base alle specifiche ECMAscript, http://www.ecma-international.org/publications/standards/Ecma-262.htm , i punti e virgola vengono automaticamente inseriti se mancanti. Questo li rende non necessari per l’autore dello script, ma implica che sono necessari per l’interprete. Ciò significa che la risposta alla domanda originale è “No”, non sono richiesti quando si scrive uno script, ma, come indicato da altri, è raccomandato per vari motivi.