Quando utilizzare le virgolette doppie o singole in JavaScript?


1968

console.log("double"); vs console.log('single');

Vedo sempre più librerie JavaScript là fuori che usano virgolette singole durante la gestione delle stringhe. Quali sono i motivi per utilizzare l'uno rispetto all'altro? Ho pensato che fossero praticamente intercambiabili.


125
quale è più facile da leggere? alert ("È l'ora del gioco"); o avviso ('È tempo di gioco');
Ryan Miller,

591
Che ne dici di questo Ryan? alert("It's \"game\" time.");o alert('It\'s "game" time.');?
Francisc,

37
Se le virgolette singole vengono sempre utilizzate e occasionalmente doppie virgolette in cui il letterale contiene virgolette singole, allora dovremo digitare molti meno pulsanti di spostamento e il mignolo sinistro ci darà benedizioni. Ma sì, come diceva @arne, per la doppia citazione JSON dovrebbe essere usato.
IsmailS

9
La citazione singola è più semplice quando si utilizza una tastiera europea (la doppia citazione è Maiusc + 2 che non è così dolce come toccare un singolo tasto comodamente dal mignolo destro).
Arne,

38
@Arne Non esiste una "tastiera europea". Ad esempio, la tastiera tedesca richiede lo spostamento per entrambi i tipi di virgolette. (Ma le virgolette singole sono più facili.)
ANeves

Risposte:


1222

Il motivo più probabile per l'uso di single vs double in librerie diverse è la preferenza del programmatore e / o la coerenza delle API. Oltre ad essere coerente, utilizzare quello che meglio si adatta alla stringa.

Utilizzando l'altro tipo di citazione come letterale:

alert('Say "Hello"');
alert("Say 'Hello'");

Questo può complicarsi:

alert("It's \"game\" time.");
alert('It\'s "game" time.');

Un'altra opzione, nuova in ES6, sono i letterali Template che usano il back-tickcarattere:

alert(`Use "double" and 'single' quotes in the same string`);
alert(`Escape the \` back-tick character and the \${ dollar-brace sequence in a string`);

I letterali template offrono una sintassi chiara per: interpolazione variabile, stringhe su più righe e altro.

Si noti che JSON è formalmente specificato per utilizzare le virgolette doppie, che potrebbe valere la pena considerare in base ai requisiti di sistema.


84
Un punto importante da notare con tutte le convenzioni del codice: definiscilo una volta e mantienilo. IOW, non usare virgolette doppie da qualche parte e virgolette singole altrove.
Cerebrus,

170
@Cerebrus - Penso che la flessibilità sia OK con questo. Scegli sicuramente uno stile preferito, ma se hai bisogno di staccarti dallo stile per evitare di sfuggire a molte virgolette in una stringa. Starei bene con quello.
Martin Clarke,

5
Non penso che ci sia motivo di essere coerenti al riguardo. Non c'è alcun vantaggio per nessuno dei due, e non credo che la leggibilità sia davvero influenzata dal fatto che tu usi o meno "in un posto e" in un altro.
cdmckay,

2
@Olly Hicks, test interessante !! Le virgolette singole sono in realtà molte volte più veloci delle doppie virgolette qui in Chrome 13 (OSX). Interessante ...
Ricket,

12
Un po 'fuori tema, ma se le persone usassero la tipografia corretta, molte di queste discussioni sulla fuga sarebbero obsolete: alert('It’s “game” time')vs. alert("It’s “game” time")- non importa. Si avrebbe solo bisogno di fuggire nei (rari) casi in cui il segno primo singolo o doppio ', "in realtà è appropriato.
jotaen,

617

Se hai a che fare con JSON, va notato che in senso stretto, le stringhe JSON devono essere racchiuse tra virgolette. Certo, molte librerie supportano anche virgolette singole, ma ho avuto grossi problemi in uno dei miei progetti prima di rendermi conto che la virgoletta singola di una stringa non è in realtà secondo gli standard JSON.


5
Questo è molto rilevante quando si lavora con jQuery.ajax chiamando in un servizio ASP.NET (servizio Web, metodo pagina o MVC).
Schmuli

100
I nomi delle proprietà all'interno delle stringhe JSON devono essere racchiusi tra virgolette doppie, ma una stringa JSON nel suo insieme può essere racchiusa tra virgolette singole: var jsonString = '{"key1":"value1"}';(Non che io raccomando di creare manualmente JSON.)
nnnnnn

51
Non puoi scrivere a mano JSON se puoi .stringify() .
Camilo Martin,

23
Questo qui è l'argomento migliore per usare sempre virgolette doppie. JSON dovrebbe avere virgolette doppie. Le altre risposte danno per lo più il consiglio di "essere coerenti", il che significa che se una qualsiasi parte del linguaggio potrebbe forzare realisticamente una doppia virgoletta, è necessario utilizzare coerentemente quella doppia virgoletta.
Josh di Qaribou,

18
Ciò è rilevante anche quando si lavora con più lingue in cui quasi tutte le altre lingue (Java, C, C ++, ...) usano virgolette doppie per stringhe e virgolette singole per caratteri. Preferisco usare la stessa quotazione su tutta la linea e quindi attenersi alle doppie virgolette per JS. Con anni di touch digitando il tasto extra per passare tra virgolette doppie è del tutto irrilevante, e se la codifica è vincolata dalla digitazione, allora è necessario esercitarsi a digitare correttamente.
Lawrence Dol

336

Non esiste una soluzione migliore ; tuttavia, vorrei sostenere che a volte le virgolette doppie potrebbero essere più desiderabili:

  • I nuovi arrivati ​​avranno già familiarità con le doppie citazioni dalla loro lingua . In inglese, dobbiamo usare le virgolette doppie "per identificare un passaggio di testo tra virgolette. Se dovessimo usare una sola citazione ', il lettore potrebbe interpretarla erroneamente come una contrazione. L'altro significato di un passaggio di testo circondato da 'indica il significato "colloquiale". Ha senso rimanere coerenti con le lingue preesistenti e ciò potrebbe probabilmente facilitare l'apprendimento e l'interpretazione del codice.
  • Le virgolette doppie eliminano la necessità di sfuggire agli apostrofi (come nelle contrazioni). Si consideri la stringa: "I'm going to the mall", contro la versione altrimenti sfuggito: 'I\'m going to the mall'.
  • Le virgolette doppie indicano una stringa in molte altre lingue . Quando impari una nuova lingua come Java o C, vengono sempre utilizzate le virgolette doppie. In Ruby, PHP e Perl, le stringhe a virgoletta singola non implicano escape di barra rovesciata mentre le doppie virgolette le supportano.

  • La notazione JSON è scritta con virgolette doppie.

Tuttavia, come altri hanno affermato, è molto importante rimanere coerenti.


Il tuo primo punto sulla lingua inglese non è sempre vero e può cambiare a seconda della località / convenzione di casa. I materiali stampati in genere usano virgolette singole per il parlato e usano altre formattazioni per grandi blocchi di testo tra virgolette. Il tuo significato "colloquiale" non è una definizione utile di virgolette per enfasi. Inoltre, gli utenti inglesi sono generalmente molto poveri con virgolette e apostrofi.
John Ferguson,

2
@JohnFerguson, solo per quel motivo, potrebbe essere desiderabile usare le virgolette doppie per fare quella differenziazione (tra apostrofi e passaggi tra virgolette).
user1429980

Sono tutto sul pragmatismo. A causa del fatto che 1 stringa su 100 che scrivo o utilizzo ha virgolette doppie e molte, molte altre hanno apostrofi, io uso doppie. Alla fine della giornata, tuttavia, dovresti usare il tipo di preventivo che è 1) già in uso nel progetto se sei un nuovo sviluppatore del progetto, oppure 2) usa quello che ritieni abbia più senso.
Dudewad,

Caso in questione: quello che ho appena digitato (ci sono più apostrofi, nessuna doppia virgoletta;)
dudewad,

FWIW - questa è una citazione da un articolo di Quora: quora.com/…
theUtherSide

118

La sezione 7.8.4 della specifica descrive la notazione letterale della stringa. L'unica differenza è che DoubleStringCharacter è "SourceCharacter ma non virgoletta doppia" e SingleStringCharacter è "SourceCharacter ma non virgoletta singola". Quindi l' unica differenza può essere dimostrata così:

'A string that\'s single quoted'

"A string that's double quoted"

Quindi dipende da quanta citazione scappi vuoi fare. Ovviamente lo stesso vale per le virgolette doppie tra stringhe tra virgolette doppie.


@Gareth: Non stavo parlando delle specifiche, stavo parlando del possibile impatto sulle prestazioni. stackoverflow.com/questions/242813/...
Mathias Bynens

se stai inserendo abbastanza apostrofi nel tuo codice per compensare quante volte devi premere shift + ', allora stai sbagliando.
SgtPooki,

1
Che dire di "{\"name\": \"Peter\"}"vs '{"name": "Peter"}'? Certo, potresti dire che questa è la stessa differenza, ma sicuramente influenzerebbe la tua decisione in un modo diverso rispetto all'esempio sopra.
Trevor,

@MathiasBynens - Questa è un'osservazione interessante che non è stata rilevante per almeno un anno e forse fino a 6 anni.
ArtOfWarfare il

4
Si dovrebbe usare U + 2019 per un apostrofo, non una virgoletta singola verticale
jjg

95

Citazioni singole

Vorrei che le doppie virgolette fossero lo standard, perché hanno un po 'più senso , ma continuo a usare le virgolette singole perché dominano la scena.

Virgolette singole:

Nessuna preferenza:

Virgolette:


7
Crockford ora preferisce le doppie virgolette.
Adam Calvet Bohl,

6
airbnb ora preferisce le doppie virgolette
Suraj Jain il

15
@SurajJain Source? Le guide di stile di Airbnb e Google continuano a elencare singole come preferite.
Alec Mev,

5
@SurajJain Ah, queste sono configurazioni di checker in stile codice, scritte in JSON, che non consentono affatto virgolette singole. Leggerli è un bel modo di confrontare le scelte fatte da diversi progetti.
Alec Mev,

2
Google ora preferisce virgolette singole
GabrielOshiro

57

Vorrei dire che la differenza è puramente stilistica, ma ho davvero i miei dubbi. Considera il seguente esempio:

/*
   Add trim() functionality to JavaScript...
    1. By extending the String prototype
    2. By creating a 'stand-alone' function
   This is just to demonstrate results are the same in both cases.
*/

// Extend the String prototype with a trim() method
String.prototype.trim = function() {
 return this.replace(/^\s+|\s+$/g, '');
};

// 'Stand-alone' trim() function
function trim(str) {
 return str.replace(/^\s+|\s+$/g, '');
};

document.writeln(String.prototype.trim);
document.writeln(trim);

In Safari, Chrome, Opera e Internet Explorer (testato in IE7 e IE8), questo restituirà quanto segue:

function () {
 return this.replace(/^\s+|\s+$/g, '');
}
function trim(str) {
 return str.replace(/^\s+|\s+$/g, '');
}

Tuttavia, Firefox produrrà un risultato leggermente diverso:

function () {
    return this.replace(/^\s+|\s+$/g, "");
}
function trim(str) {
    return str.replace(/^\s+|\s+$/g, "");
}

Le virgolette singole sono state sostituite da virgolette doppie. (Nota anche come lo spazio di rientro è stato sostituito da quattro spazi.) Questo dà l'impressione che almeno un browser analizzi JavaScript internamente come se tutto fosse scritto usando virgolette doppie. Si potrebbe pensare, Firefox impiega meno tempo per analizzare JavaScript se tutto è già scritto secondo questo "standard".

Il che, tra l'altro, mi rende un panda molto triste, dal momento che penso che le virgolette singole siano molto più belle nel codice. Inoltre, in altri linguaggi di programmazione, di solito sono più veloci da usare rispetto alle doppie virgolette, quindi avrebbe senso solo se lo stesso fosse applicato a JavaScript.

Conclusione: penso che dobbiamo fare ulteriori ricerche su questo.

Modifica: questo potrebbe spiegare i risultati dei test di Peter-Paul Koch nel 2003.

Sembra che le virgolette singole siano a volte più veloci in Windows Explorer (circa 1/3 dei miei test hanno mostrato un tempo di risposta più veloce), ma se Mozilla mostra una differenza, gestisce le virgolette doppie leggermente più velocemente. Non ho trovato alcuna differenza in Opera.

Modifica 2014: le versioni moderne di Firefox / Spidermonkey non lo fanno più.


25
Se è leggermente più veloce in un browser farlo in un modo e leggermente più veloce in un altro per farlo nell'altro modo, sembra che l'unica guida che possiamo toglierci è che dovremmo fare tutto ciò che ci piace di più perché farà male utenti e aiutare gli altri, e la quantità di differenza sarà probabilmente impercettibile. "Ottimizzazione prematura ..." e tutto il resto.
Andrew Hedges,

2
Mi dispiace che il mio commento non sia stato più costruttivo. Sto solo dicendo che il modo in cui il browser sceglie di visualizzare la sua rappresentazione interna della sintassi probabilmente ha ben poco a che fare con il modo in cui viene analizzato e quindi probabilmente non è un motivo per preferire un tipo di virgolette rispetto all'altro. I dati sulle prestazioni che confrontano i tempi di analisi per virgolette singole e doppie tra i browser, d'altra parte, sarebbero più convincenti.
Chris Calo,

1
Questa è una risposta fantastica, una pausa dal resto che cinguetta semplicemente "Sono gli stessi, sono gli stessi" ... Hai detto "Inoltre, in altri linguaggi di programmazione, di solito sono più veloci da usare rispetto al doppio virgolette " , posso chiedere in quali lingue? Ho usato lang regolari come Java e C #, mai visto uno diverso da JS che accetta letterali di stringa tra virgolette singole. Gli allegati a virgoletta singola vengono generalmente utilizzati solo per le costanti di caratteri (è consentito solo un carattere).
ADTC,

3
AFAIK questo è stato risolto in Firefox 17, Firefox eseguiva la decompilazione quando lo faceva, .toStringma ora restituisce la copia originale. Firefox moderno non avrà questo problema.
Benjamin Gruenbaum,

3
Non so delle differenze di velocità. Ma vorrei notare che "Questo dà l'impressione che almeno un browser analizzi JavaScript internamente come se tutto fosse scritto con virgolette doppie". è una sciocchezza. Non analizzato come se fosse scritto con virgolette doppie. Cioè ha trasformato la sua rappresentazione interna (che memorizza solo la stringa, non le virgolette) in una versione leggibile, per la quale capita di usare un set di virgolette. Comunque, questo sembra essere cambiato, secondo il commento di Benjamin.
subsub

32

Se stai facendo JavaScript incorporato (probabilmente una cosa "cattiva", ma evitando quella discussione), le singole virgolette sono la tua unica opzione per i letterali di stringa, credo.

ad esempio, funziona perfettamente:

<a onclick="alert('hi');">hi</a>

Ma non puoi racchiudere il "ciao" tra virgolette doppie, tramite qualsiasi metodo di escape di cui sono a conoscenza. Anche &quot;quale sarebbe stata la mia ipotesi migliore (dal momento che stai sfuggendo alle virgolette in un valore di attributo di HTML) non funziona per me in Firefox. \"non funzionerà neanche perché a questo punto stai scappando per HTML, non JavaScript.

Quindi, se il nome del gioco è coerenza e hai intenzione di creare JavaScript incorporato in alcune parti della tua app, penso che le virgolette singole siano il vincitore. Qualcuno, per favore, correggimi se sbaglio.


8
Concordato sull'essere probabilmente una brutta cosa, tuttavia se deve essere fatto, sono abbastanza sicuro che possa essere usata la codifica in stile URL, ad es. <a onclick="alert(%22hi%22);">hi</a>- dalla memoria funziona, anche se potrebbe essere stata invece nell'attributo href<a href="javascript:alert(%22hi%22);">hi</a>
Graza

2
@PhiLho hai ragione su questo ... Supponevo che le persone stessero scrivendo attributi HTML convenzionalmente a doppia virgoletta e non avrebbero intenzione di (1) convertire tutto all'ingrosso in virgolette singole o (2) mescolare e abbinare attributi a virgola singola e doppia. Ma sì, hai ragione, è legale
Tom Lianza,

4
@ Tom Lianza, sicuramente alert(&quot;hi&quot;)non è valido JavaScript. Ma i valori degli attributi sono codificati. w3.org/TR/html4/intro/sgmltut.html#didx-attribute
Robert

4
D'accordo con @Robert qui. &quot;è il modo corretto per evitare una doppia virgoletta all'interno di un attributo HTML. Funziona bene in Firefox. @Denilson, XML (e quindi XHTML) consente sia virgolette singole che doppie. Vedi il AttValueletterale nelle specifiche XML su w3.org/TR/REC-xml/#d0e888 .
Chris Calo,

1
@Pacener: Perché non è sbagliato. Esiste una convenzione in HTML per inserire attributi tra virgolette doppie.
Konrad Borowski

30

Tecnicamente non c'è differenza, è solo questione di stile e convenzione.

Douglas Crockford consiglia di utilizzare virgolette singole per stringhe interne e doppie virgolette per esterno (per esterno intendiamo quelli da visualizzare all'utente dell'applicazione, come messaggi o avvisi).

Lo seguo personalmente.

AGGIORNAMENTO: Sembra che il signor Crockford abbia cambiato idea e ora raccomanda di usare le doppie virgolette :)


13
Douglas Crockford vs JQuery. Scegli il tuo veleno.
Eric,

Qual è il ragionamento di Crockford per questo?
BadHorsie,

1
Questa è la convenzione che seguo. È una preferenza più personale. Mi piace usare stringhe tra virgolette singole per elementi interni come i selettori jQuery e / o cose come getElementById ('id') ;, Mi piace il modo in cui appare tra virgolette singole. Ma passa alle virgolette doppie per il testo esterno, poiché spesso può contenere virgolette interne nel testo. Inoltre, semplifica l'individuazione e la differenziazione tra stringhe esterne e interne se stai cercando di trovare un errore nell'una o nell'altra.
adimauro,

3
Ad aprile 2016, Douglas Crockford ora consiglia di utilizzare solo virgolette doppie, dato che in pratica molti sviluppatori hanno trovato difficile usare la dicotomia interna contro esterna.
Thunderforge,

27

A rigor di termini, non vi è alcuna differenza nel significato; quindi la scelta si riduce alla convenienza.

Ecco alcuni fattori che potrebbero influenzare la tua scelta:

  • Stile house: alcuni gruppi di sviluppatori utilizzano già una convenzione o l'altra.
  • Requisiti lato client: utilizzerai le virgolette nelle stringhe? (Vedi la risposta di Ady).
  • Linguaggio lato server: le persone VB.Net potrebbero scegliere di utilizzare virgolette singole per java-script in modo che gli script possano essere costruiti sul lato server (VB.Net utilizza virgolette doppie per le stringhe, quindi le stringhe java-script sono facili da distinguere se usano virgolette singole).
  • Codice libreria: se stai utilizzando una libreria che utilizza uno stile particolare, potresti considerare di utilizzare lo stesso stile da solo.
  • Preferenza personale: potresti pensare che uno o l'altro stile sia migliore.

Non è vero, 'è 00100111in binario, mentre "è 00100010in binario. Pertanto, le virgolette doppie occupano la metà del potere di memorizzazione delle virgolette singole. Questa è la differenza proprio lì.

19

Diamo un'occhiata a cosa fa un riferimento.

All'interno di jquery.js, ogni stringa è racchiusa tra virgolette doppie.

Quindi, a partire da ora, userò stringhe tra virgolette doppie. (Stavo usando single!)


11
Perché questo è votato verso il basso. Questa è una questione di stile e lo stile migliore è quello di essere coerenti e seguire quelli che ti hanno preceduto.
Eric,

2
+1 Anche la documentazione dell'API jQuery lo fa. Questa è stata l'unica ragione per cui ho optato per le doppie virgolette. Personalmente, penso che le risposte che "dipendono dalle preferenze personali" siano un po 'imperfette: meglio scoprire una convenzione ampiamente usata e attenersi ad essa. E poiché potrei voler copiare e incollare esempi da jQuery (direttamente o indirettamente), non voglio sostituire le virgolette ogni volta.
Steve Chambers,

2
Forse jQuery non è riuscito a seguire le persone prima di loro (o davvero non gliene importava, come la maggior parte degli altri esperti). ;)
James Wilkins,

14

Mantieni la coerenza in ciò che usi. Ma non deludere il tuo livello di comfort.

"This is my string."; // :-|
"I'm invincible."; // comfortable :)
'You can\'t beat me.'; // uncomfortable :(
'Oh! Yes. I can "beat" you.'; // comfortable :)
"Do you really think, you can \"beat\" me?"; // uncomfortable :(
"You're my guest. I can \"beat\" you."; // sometimes, you've to :P
'You\'re my guest too. I can "beat" you too.'; // sometimes, you've to :P

Aggiornamento ES6

Utilizzando la sintassi letterale del modello .

`Be "my" guest. You're in complete freedom.`; // most comfort :D

13

È principalmente una questione di stile e preferenza. Ci sono alcune esplorazioni tecniche piuttosto interessanti e utili nelle altre risposte, quindi forse l'unica cosa che potrei aggiungere è offrire un piccolo consiglio mondano.

  • Se stai codifica di una società o di squadra, allora è probabilmente una buona idea di seguire la "stile della casa".

  • Se sei da solo l'hacking alcuni progetti collaterali, quindi guardare alcuni leader di spicco nella comunità. Ad esempio, supponiamo che entri in Node.js. Dai un'occhiata ai moduli principali, ad esempio underscore.js o express e vedi quale convenzione usano, e considera di seguirlo.

  • Se entrambe le convenzioni sono ugualmente utilizzati, quindi rinviare al personal
    preferenza.

  • Se non avete preferenze personali, poi lancia una moneta.

  • Se non hai una moneta, allora la birra è su di me;)


13

Spero di non aggiungere qualcosa di ovvio, ma ho lottato con Django e Ajax e JSON su questo.

Supponendo che nel tuo codice HTML utilizzi virgolette doppie, come normalmente dovrebbe essere, consiglio vivamente di usare virgolette singole per il resto in JavaScript.

Quindi sono d'accordo con @ady ma con una certa cura.

La mia linea di fondo è: in JavaScript probabilmente non ha importanza, ma non appena lo si incorpora in HTML o simili inizi a creare problemi. Dovresti sapere cosa sta effettivamente scappando, leggendo, passando la tua stringa.

Il mio semplice caso era:

tbox.innerHTML = tbox.innerHTML + '<div class="thisbox_des" style="width:210px;" onmouseout="clear()"><a href="https://stackoverflow.com/this/thislist/'
                   + myThis[i].pk +'"><img src="/site_media/'
                   + myThis[i].fields.thumbnail +'" height="80" width="80" style="float:left;" onmouseover="showThis('
                   + myThis[i].fields.left +','
                   + myThis[i].fields.right +',\''
                   + myThis[i].fields.title +'\')"></a><p style="float:left;width:130px;height:80px;"><b>'
                   + myThis[i].fields.title +'</b> '
                   + myThis[i].fields.description +'</p></div>'

Puoi individuare \ "nel terzo campo di showThis.

La doppia citazione non ha funzionato!

È chiaro perché, ma è anche chiaro perché dovremmo attenerci a virgolette singole ... .. Immagino ..

Questo caso è un incorporamento HTML molto semplice, l'errore è stato generato da una semplice copia / incolla da un codice JavaScript "tra virgolette doppie".

Quindi, per rispondere alla domanda:

Prova a usare virgolette singole all'interno di HTML. Potrebbe salvare un paio di problemi di debug ...


1
Ho riscontrato un problema simile con l'interpolazione di stringhe ES6 (backtick). Il mio sistema di compilazione lo ha compilato in una stringa tra virgolette doppie, che ha rotto un'intestazione Auth che aveva funzionato con virgolette singole!
Jay,

12

Non sono sicuro se questo è rilevante nel mondo di oggi, ma le doppie virgolette erano utilizzate per i contenuti che dovevano essere elaborati i caratteri di controllo e le virgolette singole per le stringhe che non lo facevano.

Il compilatore eseguirà la manipolazione della stringa su una stringa tra virgolette doppie lasciando letteralmente intatta una singola stringa tra virgolette. Questo portava agli sviluppatori "bravi" a scegliere di usare virgolette singole per stringhe che non contenevano caratteri di controllo simili \no \0(non elaborati tra virgolette singole) e virgolette doppie quando avevano bisogno della stringa analizzata (a un costo contenuto nei cicli cpu per elaborazione della stringa).


14
Non è che le cose fossero fatte in un modo e ora ne hanno fatto un altro. Lingue diverse gestiscono le virgolette in modo diverso e alcune funzionano come descritto. Ma questa è una domanda JavaScript . Le virgolette singole e doppie sono trattate in modo identico in JavaScript (tranne per consentire l'utilizzo dell'altro tipo di virgoletta in una stringa senza escape). Non si tratta di virgolette doppie che consentono caratteri di controllo o interpolazione di stringhe. JavaScript non funziona in questo modo. I personaggi di controllo e le sequenze di escape funzionano nello stesso tipo di citazione che usi.
Michael Geary,

Come ex programmatore Perl, questo è quello che continuo a pensare anche se so che è irrilevante in JS.
zkent,

12

Se si utilizza jshint , genererà un errore se si utilizza una stringa di virgolette doppie.

L'ho usato attraverso l'impalcatura Yeoman di AngularJS ma forse c'è un modo per configurarlo.

A proposito, quando gestisci l'HTML in JavaScript, è più facile usare la singola citazione:

var foo = '<div class="cool-stuff">Cool content</div>';

E almeno JSON utilizza le virgolette doppie per stringhe rappresentative.

Non esiste un modo banale per rispondere alla tua domanda


L'implementazione jshint è cambiata? poiché il sito Web della demo sembra accettare o senza generare alcun avvertimento / errore e non riesco a trovare alcuna opzione per limitare l'utilizzo di jshint. Forse questa risposta è obsoleta o inaccurata?
Lea Hayes,

se jshint genera un errore per una stringa tra virgolette doppie, è gravemente interrotto. Lo standard JavaScript definisce ciò che è corretto e non qualche linter rotto.
Mecki,

10

A proposito di prestazioni, le virgolette non saranno mai il collo di bottiglia, tuttavia le prestazioni sono le stesse in entrambi i casi.

Per quanto riguarda la velocità di codifica, se si utilizza 'per delimitare una stringa, sarà necessario evitare le "virgolette. È più probabile che sia necessario utilizzare "all'interno della stringa, ad esempio:

//JSON Objects:
var jsonObject = '{"foo":"bar"}';
//HTML attributes:
document.getElementById("foobar").innerHTML = '<input type="text">';

Quindi, preferisco usare 'per delimitare la stringa, quindi devo scappare meno caratteri.


10

Una (sciocca) ragione per usare le virgolette singole sarebbe che non richiedono di premere il tasto Maiusc per digitarle, mentre una doppia virgoletta lo fa. (Suppongo che la stringa media non richieda l'escaping, il che è un presupposto ragionevole.) Ora, supponiamo che ogni giorno codice 200 righe di codice. Forse in quelle 200 righe ho 30 virgolette. Forse digitare una virgoletta doppia richiede 0,1 secondi in più rispetto alla digitazione di una virgoletta singola (perché devo premere il tasto Maiusc). Quindi in un dato giorno, spreco 3 secondi. Se codifico in questo modo per 200 giorni all'anno per 40 anni, allora ho sprecato 6,7 ore della mia vita. Cibo per la mente.


1
Immagino che ti riferisci solo al layout della tastiera inglese qui ... Ne ho uno tedesco, devo premere il tasto shift per entrambi. Comunque non vedo perché premendo il tasto Maiusc si aggiunge tempo al processo. Premo shift con la mano sinistra e premo il tasto delle virgolette con la destra. Succede allo stesso tempo, per me non c'è differenza.
codewandler,

1
@codewandler C'è ancora un costo per dover premere il tasto Maiusc anche se è possibile premerlo in parallelo al tasto ". Ti costringe a spostare un dito lontano dalla sua posizione predefinita. Ad esempio, supponiamo che stai digitando: var description = "This is a \"quick\" test";on una tastiera inglese. Per una tastiera inglese, il tuo mignolo deve spostarsi dal tasto Maiusc sinistro al tasto Q nella riga superiore invece di spostarsi dal tasto A al tasto Q. In altre parole, deve percorrere il doppio della distanza Non sono sicuro di dove siano i tasti sulla tastiera tedesca, ma sono sicuro che ci sia un esempio analogo
John Kurlak,

2
@codewandler Inoltre, dover digitare shift, anche se posso farlo in parallelo, non consente al mignolo sinistro di prepararsi a digitare il carattere successivo dopo "in qualunque cosa tu stia digitando.
John Kurlak,

1
L'idea di "perdere tempo" è un po 'sciocca, ma l'idea di una tensione meno ergonomica (specialmente nell'era della sindrome del tunnel carpale, ecc.), La rende un buon guadagno, specialmente nei casi in cui altrimenti non importa. Dato oltre 1.000 righe di codice al giorno, questo potrebbe salvare centinaia di curve al mignolo giornaliere.
Beejor,

9

Esaminando i pro e i contro

A favore di virgolette singole

  • Meno disordine visivo.
  • Generazione di HTML: gli attributi HTML sono generalmente delimitati da virgolette doppie.

elem.innerHTML = '<a href="' + url + '">Hello</a>';
Tuttavia, le virgolette singole sono altrettanto legali in HTML.

elem.innerHTML = "<a href='" + url + "'>Hello</a>";

Inoltre, l'HTML in linea è normalmente un anti-pattern. Preferisci modelli.

  • Generazione di JSON: in JSON sono consentite solo virgolette doppie.

myJson = '{ "hello world": true }';

Ancora una volta, non dovresti costruire JSON in questo modo. JSON.stringify () è spesso abbastanza. In caso contrario, utilizzare i modelli.

A favore delle doppie virgolette

  • I doppi sono più facili da individuare se non si dispone di un codice colore. Come in un registro della console o in una sorta di configurazione della vista-sorgente.
  • Somiglianza con altre lingue: nella programmazione della shell (Bash ecc.) Esistono letterali stringa a virgoletta singola, ma gli escape non sono interpretati al loro interno. C e Java usano virgolette doppie per stringhe e virgolette singole per caratteri.
  • Se si desidera che il codice sia JSON valido, è necessario utilizzare virgolette doppie.

A favore di entrambi

Non c'è alcuna differenza tra i due in JavaScript. Pertanto, è possibile utilizzare ciò che è conveniente al momento. Ad esempio, i seguenti valori letterali di stringa producono tutti la stessa stringa:

    "He said: \"Let's go!\""
    'He said: "Let\'s go!"'
    "He said: \"Let\'s go!\""
    'He said: \"Let\'s go!\"'

Virgolette singole per stringhe interne e doppie per esterno. Ciò consente di distinguere le costanti interne dalle stringhe che devono essere visualizzate all'utente (o scritte su disco, ecc.). Ovviamente, dovresti evitare di inserire quest'ultimo nel tuo codice, ma non è sempre possibile farlo.


8

Un'altra cosa che potresti considerare come una ragione per il passaggio da virgolette doppie a virgolette singole è l'aumento della popolarità degli script lato server. Quando usi PHP puoi passare variabili e analizzare le funzioni javascript usando stringhe e variabili in PHP.

Se scrivi una stringa e usi le virgolette doppie per il tuo PHP non dovrai sfuggire a nessuna delle virgolette singole e PHP recupererà automaticamente il valore delle variabili per te.

Esempio: ho bisogno di eseguire una funzione JavaScript utilizzando una variabile dal mio server.

public static function redirectPage( $pageLocation )
{
    echo "<script type='text/javascript'>window.location = '$pageLocation';</script>";
}

Questo mi fa risparmiare molta seccatura nel dover gestire le stringhe di unione e posso effettivamente chiamare un javascript da PHP. Questo è solo un esempio, ma questo può essere uno dei diversi motivi per cui i programmatori stanno impostando le virgolette singole su javascript.

Citazione da documenti PHP : "La caratteristica più importante delle stringhe tra virgolette doppie è il fatto che i nomi delle variabili verranno espansi. Vedere l'analisi delle stringhe per i dettagli."


+1, lo faccio nel mio progetto MVC.Net in modo che le doppie virgolette di C # non interferiscano con le virgolette singole di javascript e viceversa.
DCShannon

3
Penso che se stai scrivendo JavaScript sulla tua pagina da un metodo di classe PHP hai grossi problemi.
BadHorsie,

6

Ci sono persone che affermano di vedere differenze di prestazioni: vecchio thread della mailing list . Ma non sono riuscito a trovarne nessuno da confermare.

La cosa principale è guardare che tipo di virgolette (doppie o singole) stai usando nella tua stringa. Aiuta a mantenere basso il numero di fughe. Ad esempio, quando lavori con HTML all'interno delle tue stringhe, è più facile usare le virgolette singole in modo da non dover sfuggire a tutte le doppie virgolette attorno agli attributi.


Sebbene gli attributi possano essere racchiusi tra virgolette singole :)
Damir Zekić,

Vero, ho pensato che xml e xhtml prescrivessero doppie virgolette intorno agli attributi, ma sono consentite virgolette singole.
Michiel Overeem,

6

Vorrei usare le virgolette doppie quando non è possibile utilizzare virgolette singole e viceversa:

"'" + singleQuotedValue + "'"
'"' + doubleQuotedValue + '"'

Invece di:

'\'' + singleQuotedValue + '\''
"\"" + doubleQuotedValue + "\""

Che dire di una stringa contenente sia una virgoletta singola che una doppia virgoletta come O'rea "lly
sudhAnsu63,

6

Non c'è differenza tra virgolette singole e doppie in JavaScript.

Le specifiche sono importanti:

Forse ci sono differenze di prestazioni, ma sono assolutamente minime e possono cambiare ogni giorno in base all'implementazione dei browser. Ulteriori discussioni sono inutili a meno che l'applicazione JavaScript non sia lunga centinaia di migliaia.

È come un punto di riferimento se

a=b;

è più veloce di

a = b;

(spazi extra)

oggi, in un particolare browser e piattaforma, ecc.


2
senza spazi è più veloce. meno caratteri da analizzare nella stringa. : p
pilavdzice,

6

Quando uso CoffeeScript uso doppie virgolette. Sono d'accordo che dovresti scegliere uno dei due e attenersi ad esso. CoffeeScript fornisce interpolazione quando si utilizzano le virgolette doppie.

"This is my #{name}"

ES6 sta usando i segni di spunta indietro (`) per le stringhe del modello. Il che probabilmente ha una buona ragione, ma durante la codifica può essere scomodo cambiare il carattere letterale delle stringhe tra virgolette o virgolette doppie in back tick per ottenere la funzione di interpolazione. CoffeeScript potrebbe non essere perfetto, ma usare lo stesso carattere letterale di stringa ovunque (virgolette doppie) ed essere sempre in grado di interpolare è una bella caratteristica.

`This is my ${name}`

Per me il segno di spunta è un chiaro vincitore in questo concorso, (quasi) nessuna presenza all'interno di stringhe di testo comuni, più interpolazione var
Simone Poggi

5

Se stai saltando indietro tra JavaScript e C #, è meglio allenare le dita per la convenzione comune che è tra virgolette doppie.


5

Ho seguito quanto segue circa 20 volte. E sembra che le doppie virgolette siano circa il 20% più veloci.

La parte divertente è che se cambi la parte 2 e la parte 1 in giro, le virgolette singole sono circa il 20% più veloci.

//Part1
var r='';
var iTime3 = new Date().valueOf();
for(var j=0; j<1000000; j++) {
    r+='a';
}
var iTime4 = new Date().valueOf();
alert('With single quote : ' + (iTime4 - iTime3));  

//Part 2                
var s="";
var iTime1 = new Date().valueOf();
for(var i=0; i<1000000; i++) {
    s += "a";
}
var iTime2 = new Date().valueOf();
alert('With double quote: ' + (iTime2 - iTime1));

31
In altre parole, hai scoperto che il codice successivo viene eseguito più velocemente. Questo è il problema quando si eseguono micro-benchmark. Devi tenere conto del motore JS che ottimizza il codice durante l'esecuzione. (Vedrai lo stesso effetto durante il benchmarking di Java a causa del funzionamento della JIT.)
David Phillips,

4
la prima nuova data è lenta, aggiungi var dummy_date = new Date()all'inizio
Lauri,

1
Il livello di micro-ottimizzazione qui è così sciocco che potresti anche sostenere che le virgolette singole sono più veloci da digitare, portando a uno sviluppo più veloce.
Beejor,

4

Non c'è assolutamente alcuna differenza, quindi è principalmente una questione di gusti e di ciò che è nella stringa (o se il codice JS stesso è in una stringa), per mantenere basso il numero di escape.

La legenda della differenza di velocità potrebbe provenire dal mondo PHP, in cui le due virgolette hanno un comportamento diverso.


E Ruby, posso aggiungere. Python ha lo stesso comportamento di JavaScript: non viene fatta alcuna differenza tra virgolette singole / doppie.
Damir Zekić,

4

Dopo aver letto tutte le risposte che dicono che potrebbe essere più veloce o forse avere dei vantaggi, direi che la doppia virgoletta è migliore o forse anche più veloce perché il compilatore di chiusura di Google converte le virgolette singole in virgolette doppie.


Sai perché lo fa?
ma11hew28,

Non lo so. Forse è una convenzione di codifica e niente di speciale.
Mohsen,

4

Ora che è il 2020, dovremmo considerare una terza opzione per Javascript: il singolo backtick per tutto.

Questo può essere usato ovunque anziché tra virgolette singole o doppie.

Ti permette di fare tutto!

  1. Incorpora al suo interno virgolette singole: "È fantastico!"
  2. Incorpora doppie virgolette al suo interno: "È" davvero "fantastico!`
  3. Usa l'interpolazione di stringhe: `È" $ {better} "che great!`
  4. Permette più linee: `

    Questo

    Fa

    Javascript

    Meglio!

    `

Inoltre non causa alcuna perdita di prestazioni quando si sostituiscono gli altri due: https://medium.com/javascript-in-plain-english/are-backticks-slower-than-other-strings-in-javascript-ce4abf9b9fa


3

Se la tua fonte JS è:

elem.innerHTML="<img src='smily' alt='It\'s a Smily' style='width:50px'>";

Il sorgente HTML sarà:

<img src="smiley" alt="It's a Smiley" style="width:50px">

o per HTML5

<img src=smiley alt="It's a Smiley" style=width:50px>

JS consente matrici del genere:

var arr=['this','that'];

Ma se lo stringi, sarà per ragioni compatibili:

JSON=["this","that"]

Sono sicuro che ci vorrà del tempo.


3

Solo per aggiungere i miei 2 centesimi: lavorando con JS e PHP qualche anno fa, mi sono abituato a usare virgolette singole in modo da poter digitare il carattere di escape ('\') senza doverlo scappare. Di solito lo usavo quando scrivevo stringhe non elaborate con percorsi di file, ecc. ( Http://en.wikipedia.org/wiki/String_literal#Raw_strings )

Ad ogni modo, la mia convenzione finì per diventare l'uso di virgolette singole su stringhe non elaborate di tipo identificativo, come if (typeof s == 'string') ...(in cui i caratteri di escape non sarebbero mai stati usati mai) e doppie virgolette per testi come "Ehi, come va?". Uso anche virgolette singole nei commenti come convenzione tipografica per mostrare i nomi degli identificatori. Questa è solo una regola empirica e mi interrompo solo quando necessario, ad esempio quando si digitano stringhe HTML '<a href="#"> like so <a>'(anche se qui è possibile invertire anche le virgolette). Sono anche consapevole che, nel caso di JSON, per i nomi vengono utilizzate le virgolette doppie, ma al di fuori di ciò, personalmente, preferisco le virgolette singole quando non è mai necessario scappare per il testo tra virgolette document.createElement('div').

In conclusione, e come alcuni hanno accennato / accennato, scegliere una convenzione, attenersi ad essa e deviare solo quando necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.