Kiedy stosować podwójne lub pojedyncze cudzysłowy w JavaScript?


1968

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

Widzę coraz więcej bibliotek JavaScript używających pojedynczych cudzysłowów podczas obsługi ciągów. Jakie są powody używania jednego nad drugim? Myślałem, że są one prawie wymienne.


125
który jest łatwiejszy do odczytania? alert („Czas na grę”); lub alert („Czas na grę”);
Ryan Miller,

591
A co z tym Ryanem? alert("It's \"game\" time.");czy alert('It\'s "game" time.');?
Francisc

37
Jeśli zawsze używane są pojedyncze cytaty, a czasami podwójne cytaty, w których literał zawiera pojedynczy cytat, będziemy musieli wpisać znacznie mniej przycisków Shift, a nasz lewy mały palec da nam błogosławieństwo. Ale tak, jak powiedział @arne, w przypadku JSON należy użyć podwójnego cudzysłowu.
IsmailS

9
Pojedynczy cytat jest łatwiejszy do zrobienia, gdy używasz europejskiej klawiatury (podwójny cudzysłów to Shift + 2, co nie jest tak słodkie, jak wygodne dotykanie jednego klawisza prawym klawiszem różowym).
Arne,

38
@Arne Nie ma czegoś takiego jak „europejska klawiatura”. Np. Niemiecka klawiatura wymaga przesunięcia dla obu rodzajów cytatów. (Ale pojedyncze cytaty są łatwiejsze).
ANeves

Odpowiedzi:


1221

Najbardziej prawdopodobnym powodem użycia pojedynczego vs podwójnego w różnych bibliotekach jest preferencja programisty i / lub spójność API. Poza konsekwentnym stosowaniem tego, który najlepiej pasuje do łańcucha.

Używając innego rodzaju cytatu jako literału:

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

To może się skomplikować:

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

Inną opcją, nową w ES6, są literały szablonów, które używają back-tickznaku:

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

Literały szablonów oferują czystą składnię dla: zmiennej interpolacji, ciągów wieloliniowych i innych.

Zauważ, że JSON jest formalnie określony, aby używać podwójnych cudzysłowów, które warto rozważyć w zależności od wymagań systemowych.


84
Ważna uwaga na wszystkie konwencje kodu - Zdefiniuj go raz i trzymaj się go. IOW, nie używaj podwójnych cudzysłowów gdzieś i pojedynczych cudzysłowów gdzie indziej.
Cerebrus

170
@ Cerebrus - Myślę, że elastyczność jest w tym przypadku OK. Jasne, wybierz preferowany styl, ale jeśli musisz oderwać się od stylu, aby zapisać wiele cytatów w jednym ciągu. Byłbym z tym w porządku.
Martin Clarke

5
Nie sądzę, żeby istniał jakiś powód, aby być konsekwentnym. Żadna z nich nie ma żadnej korzyści i nie sądzę, że na czytelność ma to duży wpływ, niezależnie od tego, czy używasz „w jednym miejscu”, czy w innym.
cdmckay

2
@ Olly Hicks, ciekawy test !! Pojedyncze cytaty są w rzeczywistości kilka razy szybsze niż podwójne cytaty tutaj w Chrome 13 (OSX). Ciekawe ...
Ricket

12
Trochę nie na temat, ale jeśli ludzie użyją prawidłowej typografii, wiele z tych dyskusji na temat ucieczki byłoby przestarzałe: alert('It’s “game” time')vs. alert("It’s “game” time")- nie ma znaczenia. Byś tylko trzeba uciec w (rzadkich) przypadkach, gdy pojedyncze lub podwójne prime znak ', "jest rzeczywiście właściwe.
jotaen

617

Jeśli masz do czynienia z JSON, należy zauważyć, że ściśle mówiąc, ciągi JSON muszą być podwójnie cytowane. Jasne, wiele bibliotek obsługuje również pojedyncze cytaty, ale miałem jeden problem z jednym z moich projektów, zanim zdałem sobie sprawę, że pojedynczy cytat w rzeczywistości nie jest zgodny ze standardami JSON.


5
Jest to bardzo istotne podczas pracy z wywołaniem jQuery.ajax w usłudze ASP.NET (usługa sieci Web, metoda strony lub MVC).
Schmuli

100
Nazwy właściwości w łańcuchach JSON muszą być cudzysłowione, ale ciąg JSON jako całość może być cytowany: var jsonString = '{"key1":"value1"}';(Nie polecam ręcznego budowania JSON.)
nnnnnn

51
Nie możesz pisać JSON ręcznie, jeśli możesz .stringify().
Camilo Martin

23
To właśnie tutaj jest najlepszym argumentem za zawsze stosowaniem podwójnych cudzysłowów. JSON powinien mieć cudzysłowy. Pozostałe odpowiedzi w większości dają rady, by „być spójnym”, co oznacza, że ​​jeśli jakakolwiek część języka może realistycznie wymusić podwójny cytat, powinieneś konsekwentnie stosować ten podwójny cytat.
Josh z Qaribou

18
Dotyczy to również pracy z wieloma językami, w których prawie wszystkie inne języki (Java, C, C ++, ...) używają podwójnych cudzysłowów dla ciągów znaków i pojedynczych cudzysłowów dla znaków. Wolę używać tego samego cytatu na tablicy, dlatego trzymaj się podwójnych cytatów dla JS. Po wielu latach pisania na klawiaturze dodatkowy klawisz zmiany podwójnych cudzysłowów jest zupełnie nieistotny, a jeśli twoje kodowanie jest ograniczone przez pisanie, musisz ćwiczyć prawidłowe pisanie.
Lawrence Dol

336

Nie ma jednego lepszego rozwiązania ; chciałbym jednak argumentować, że podwójne cytaty mogą być czasem bardziej pożądane:

  • Nowo przybyli będą już zaznajomieni z podwójnymi cytatami z ich języka . W języku angielskim musimy użyć podwójnych cudzysłowów, "aby zidentyfikować fragment cytowanego tekstu. Gdybyśmy użyli jednego cytatu ', czytelnik mógłby błędnie zinterpretować go jako skurcz. Drugie znaczenie fragmentu tekstu otoczonego przez 'wskazuje na znaczenie „potoczny”. Rozsądne jest zachowanie spójności z wcześniej istniejącymi językami, co może prawdopodobnie ułatwić naukę i interpretację kodu.
  • Podwójne cudzysłowy eliminują potrzebę ucieczki od apostrofów (jak w skurczach). Rozważmy ciąg: "I'm going to the mall", w porównaniu z wersją inaczej ucieczki: 'I\'m going to the mall'.
  • Podwójne cudzysłowy oznaczają ciąg w wielu innych językach . Kiedy uczysz się nowego języka, takiego jak Java lub C, zawsze używane są podwójne cudzysłowy. W Ruby, PHP i Perl ciągi pojedynczego cudzysłowu nie oznaczają żadnych odwrotnych ukośników, a podwójne cudzysłowy je obsługują.

  • Notacja JSON jest napisana z podwójnymi cudzysłowami.

Niemniej jednak, jak stwierdzili inni, najważniejsze jest zachowanie spójności.


Twoja pierwsza uwaga na temat języka angielskiego nie zawsze jest prawdziwa i może się zmienić w zależności od konwencji lokalizacji / domu. Materiały drukowane zwykle używają pojedynczych cudzysłowów w mowie i stosują inne formatowanie w przypadku dużych bloków cytowanego tekstu. Twoje „potoczne” znaczenie nie jest użyteczną definicją cytatów dla podkreślenia. Ponadto użytkownicy języka angielskiego są ogólnie bardzo słabi ze znakami cudzysłowu i apostrofów.
John Ferguson

2
@JohnFerguson, tylko z tego powodu może być pożądane stosowanie podwójnych cudzysłowów, aby wprowadzić to rozróżnienie (między apostrofami a cytowanymi fragmentami).
user1429980,

Chodzi mi o pragmatyzm. Ponieważ 1 na 100 ciągów, które wpisuję lub używa, zawiera podwójne cudzysłowy, a wiele, wiele innych ma apostrofy, używam podwójnych. Jednak na koniec dnia powinieneś użyć typu cytatu, który 1) jest już używany w projekcie, jeśli jesteś nowym programistą w projekcie, lub 2) użyj tego, który Twoim zdaniem ma większy sens.
dudewad

Przykładem jest to, co właśnie napisałem (istnieje wiele apostrofów, bez podwójnych cytatów;)
dudewad

FWIW - cytat z artykułu Quora: quora.com/…
theUtherSide

118

Sekcja 7.8.4 specyfikacji opisuje dosłowny zapis ciągów. Jedyną różnicą jest to, że DoubleStringCharacter to „SourceCharacter, ale nie podwójny cudzysłów”, a SingleStringCharacter to „SourceCharacter, ale nie pojedynczy cudzysłów”. Tak więc jedyną różnicę można wykazać w ten sposób:

'A string that\'s single quoted'

"A string that's double quoted"

To zależy od tego, ile wycinków chcesz uciec. Oczywiście to samo dotyczy podwójnych cudzysłowów w ciągach podwójnie cytowanych.


@Gareth: Nie mówiłem jednak o specyfikacjach, mówiłem o możliwym wpływie na wydajność. stackoverflow.com/questions/242813/…
Mathias Bynens

jeśli wstawiasz wystarczająco dużo apostrofów, aby zrekompensować, ile razy musisz nacisnąć Shift + ', to robisz to źle.
SgtPooki

1
Co z "{\"name\": \"Peter\"}"vs '{"name": "Peter"}'? Wprawdzie można powiedzieć, że jest to ta sama różnica, ale z pewnością wpłynie to na twoją decyzję w inny sposób niż w powyższym przykładzie.
Trevor

@MathiasBynens - To ciekawe spostrzeżenie, które nie było istotne przez co najmniej rok, a może nawet przez 6 lat.
ArtOfWarfare

4
Należy używać U + 2019 do apostrofu, a nie do pojedynczego cytatu w
pionie

95

Pojedyncze cytaty

Chciałbym, żeby podwójne cytaty były standardem, ponieważ mają one trochę więcej sensu , ale wciąż używam pojedynczych cytatów, ponieważ dominują na scenie.

Pojedyncze cytaty:

Bez preferencji:

Podwójne cytaty:


7
Crockford preferuje teraz podwójne cytaty.
Adam Calvet Bohl

6
airbnb preferuje teraz podwójne cytaty
Suraj Jain

15
@SurajJain Source? Przewodniki po stylach Airbnb i Google nadal są wyświetlane jako pojedyncze jako preferowane.
Alec Mev,

5
@SurajJain Ah, są to konfiguracje sprawdzające styl kodu, napisane w JSON, które w ogóle nie pozwalają na pojedyncze cytaty. Czytanie ich jest dobrym sposobem na porównanie wyborów dokonanych przez różne projekty.
Alec Mev,

2
Google woli teraz pojedyncze cytaty
GabrielOshiro,

57

Chciałbym powiedzieć, że różnica jest czysto stylistyczna, ale naprawdę mam wątpliwości. Rozważ następujący przykład:

/*
   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);

W Safari, Chrome, Opera i Internet Explorer (testowane w IE7 i IE8), to zwróci:

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

Jednak Firefox da nieco inny wynik:

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

Pojedyncze cytaty zostały zastąpione podwójnymi. (Zwróć również uwagę, w jaki sposób wcięcie zostało zastąpione czterema spacjami). Sprawia to wrażenie, że co najmniej jedna przeglądarka analizuje JavaScript wewnętrznie, tak jakby wszystko zostało napisane przy użyciu podwójnych cudzysłowów. Można by pomyśleć, że Firefox zajmuje mniej czasu na przeanalizowanie JavaScript, jeśli wszystko jest już napisane zgodnie z tym „standardem”.

Co, nawiasem mówiąc, sprawia, że ​​jestem bardzo smutną pandą, ponieważ myślę, że pojedyncze cytaty wyglądają o wiele ładniej w kodzie. Ponadto w innych językach programowania są zwykle szybsze w użyciu niż podwójne cudzysłowy, więc miałoby to sens tylko wtedy, gdyby to samo dotyczyło JavaScript.

Wniosek: Myślę, że musimy przeprowadzić więcej badań w tym zakresie.

Edycja: To może wyjaśniać wyniki testu Petera-Paula Kocha z 2003 roku.

Wygląda na to, że pojedyncze cudzysłowy są czasem szybsze w Eksploratorze Windows (mniej więcej 1/3 moich testów wykazała krótszy czas odpowiedzi), ale jeśli Mozilla w ogóle wykazuje różnicę, obsługuje podwójne cudzysłowy nieco szybciej. W Operze nie znalazłem żadnej różnicy.

Edycja 2014: Nowoczesne wersje Firefox / Spidermonkey już tego nie robią.


25
Jeśli w jednej przeglądarce jest to nieco szybsze, aby zrobić to w jedną stronę, a nieco w drugą, aby zrobić to w drugą stronę, wydaje się, że jedyną wskazówką, którą możemy odejść, jest to, że powinniśmy robić to, co lubimy bardziej, bo to trochę zaszkodzi użytkowników i pomagać innym, a różnica będzie prawdopodobnie niezauważalna. „Przedwczesna optymalizacja ...” i tak dalej.
Andrew Hedges

2
Przykro mi, że mój komentarz nie był bardziej konstruktywny. Mówię tylko, że sposób, w jaki przeglądarka wybiera wyświetlanie wewnętrznej reprezentacji składni, prawdopodobnie nie ma wiele wspólnego z tym, jak jest analizowany, a zatem prawdopodobnie nie jest powodem, aby preferować jeden rodzaj cudzysłowów. Z drugiej strony dane dotyczące wydajności porównujące czasy analizy pojedynczych i podwójnych cudzysłowów w różnych przeglądarkach byłyby bardziej przekonujące.
Chris Calo

1
To niesamowita odpowiedź, oderwanie się od reszty, które po prostu śpiewają „Oni są tacy sami, oni są tacy sami” ... Powiedziałeś „Plus, w innych językach programowania, zwykle są szybsze w użyciu niż podwójne cytaty ” , czy mogę zapytać, które języki? Używałem regularnych języków, takich jak Java i C #, nigdy nie widziałem innego niż JS, który akceptuje literały łańcuchowe w pojedynczych cudzysłowach. Załączniki pojedynczych cudzysłowów są zwykle używane tylko dla stałych znaków (dozwolony jest tylko jeden znak).
ADTC

3
AFAIK to naprawiono w Firefox 17, Firefox robił dekompilację, .toStringale teraz zwraca oryginalną kopię. Współczesny Firefox nie będzie miał tego problemu.
Benjamin Gruenbaum,

3
Nie wiem o różnicach prędkości. Ale chciałbym zauważyć, że „To sprawia wrażenie, że przynajmniej jedna przeglądarka analizuje JavaScript wewnętrznie, jakby wszystko zostało napisane przy użyciu podwójnych cudzysłowów”. to nonsens. ROZDZIELCZO, jakby napisane podwójnymi cudzysłowami. Oznacza to, że przekształcił swoją wewnętrzną reprezentację (która po prostu przechowuje ciąg, a nie cytaty) w czytelną dla człowieka wersję, dla której zdarza się, że używa jednego zestawu cytatów. W każdym razie wydaje się, że to się zmieniło, zgodnie z komentarzem Benjamina.
subub

32

Jeśli robisz wbudowany JavaScript (prawdopodobnie „złą” rzecz, ale unikasz tej dyskusji), pojedyncze cudzysłowy są jedyną opcją dla literałów ciągowych, wierzę.

np. działa to dobrze:

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

Ale nie można zawrzeć „hi” w podwójnych cudzysłowach, za pomocą dowolnej metody zmiany znaczenia, o której wiem. Nawet, &quot;co byłoby moim najlepszym przypuszczeniem (ponieważ unikasz cytatów w wartości atrybutu HTML), nie działa dla mnie w Firefoksie. \"też nie będzie działać, ponieważ w tym momencie uciekasz do HTML, a nie JavaScript.

Tak więc, jeśli nazwa gry to spójność i zamierzasz zrobić wbudowany JavaScript w niektórych częściach swojej aplikacji, myślę, że wygrywają pojedyncze cytaty. Ktoś proszę, popraw mnie, jeśli się mylę.


8
Zgodziłem się co do bycia prawdopodobnie złą rzeczą, ale jeśli trzeba to zrobić, jestem prawie pewien, że można zastosować kodowanie w stylu adresu URL, np. <a onclick="alert(%22hi%22);">hi</a>- z pamięci to działa, chociaż zamiast tego może być w atrybucie href<a href="javascript:alert(%22hi%22);">hi</a>
Graza

2
@PhiLho masz rację ... Zakładałem, że ludzie piszą konwencjonalnie podwójnie cytowane atrybuty HTML i nie zamierzam ani (1) hurtowo konwertować wszystkiego na pojedyncze cudzysłowy, ani (2) mieszać i dopasowywać atrybuty pojedynczego i podwójnego cudzysłowu. Ale tak, masz rację, to legalne
Tom Lianza

4
@Tom Lianza, na pewno alert(&quot;hi&quot;)nie jest prawidłowy JavaScript. Ale wartości atrybutów są kodowane. w3.org/TR/html4/intro/sgmltut.html#didx-attribute
Robert

4
Uzgodniono z @Robert tutaj. &quot;to właściwy sposób na uniknięcie podwójnego cudzysłowu w atrybucie HTML. Działa dobrze w przeglądarce Firefox. @Denilson, XML (a zatem XHTML) dopuszcza zarówno pojedyncze, jak i podwójne cudzysłowy. Zobacz AttValueliterał w specyfikacji XML na w3.org/TR/REC-xml/#d0e888 .
Chris Calo,

1
@Pacener: Ponieważ to nie jest złe. W konwencji HTML istnieje konwencja umieszczania atrybutów między podwójnymi cudzysłowami.
Konrad Borowski

30

Technicznie nie ma różnicy, to tylko kwestia stylu i konwencji.

Douglas Crockford zaleca stosowanie pojedynczych cudzysłowów dla wewnętrznych ciągów i podwójnych cudzysłowów dla zewnętrznych (przez zewnętrzne rozumiemy te, które mają być wyświetlane użytkownikowi aplikacji, takie jak wiadomości lub alerty).

Ja osobiście to śledzę.

AKTUALIZACJA: Wygląda na to, że pan Crockford zmienił zdanie i teraz zaleca stosowanie podwójnych cytatów w całym :)


13
Douglas Crockford vs JQuery. Wybierz swoją truciznę.
Eric

Jakie jest tego uzasadnienie Crockforda?
BadHorsie

1
To konwencja, której przestrzegam. To bardziej osobiste preferencje. Lubię używać ciągów pojedynczych cudzysłowów do wewnętrznych rzeczy, takich jak selektory jQuery i / lub rzeczy takich jak getElementById ('id') ;, Po prostu podoba mi się sposób, w jaki wygląda z pojedynczymi cudzysłowami. Ale przejdź do podwójnych cudzysłowów dla tekstu zewnętrznego, ponieważ często może zawierać wewnętrzne cudzysłowy w tekście. Ponadto ułatwia wykrywanie i rozróżnianie ciągów zewnętrznych od wewnętrznych, jeśli próbujesz znaleźć błąd w jednym lub drugim.
adimauro

3
Od kwietnia 2016 r. Douglas Crockford zaleca teraz stosowanie tylko podwójnych cudzysłowów, biorąc pod uwagę, że w praktyce wielu programistów uznało dychotomię wewnętrzną i zewnętrzną za trudną w użyciu.
Thunderforge

27

Ściśle mówiąc, nie ma różnicy w znaczeniu; więc wybór sprowadza się do wygody.

Oto kilka czynników, które mogą wpłynąć na twój wybór:

  • Styl domu: Niektóre grupy programistów używają już jednej konwencji lub innej.
  • Wymagania po stronie klienta: czy będziesz używać cudzysłowów w łańcuchach? (Zobacz odpowiedź Ady).
  • Język po stronie serwera: ludzie VB.Net mogą zdecydować się na użycie pojedynczych cudzysłowów dla skryptu java, aby skrypty mogły być budowane po stronie serwera (VB.Net używa podwójnych cudzysłowów dla ciągów, więc ciągi skryptów java są łatwe do rozróżnienia jeśli używają pojedynczych cudzysłowów).
  • Kod biblioteki: jeśli korzystasz z biblioteki, która używa określonego stylu, możesz rozważyć użycie tego samego stylu.
  • Preferencje osobiste: Możesz pomyśleć, że jeden lub drugi styl wygląda lepiej.

Nieprawda, 'jest 00100111w formacie binarnym, podczas gdy "jest 00100010w formacie binarnym. Zatem podwójne cudzysłowy zajmują o połowę mniej energii do przechowywania niż pojedyncze cudzysłowy. Na tym polega różnica.

19

Zobaczmy, co robią referencje.

W pliku jquery.js każdy ciąg znaków jest cytowany podwójnie.

Więc od teraz będę używał ciągów cudzysłowów. (Używałem singla!)


11
Dlaczego jest to przegłosowane. To kwestia stylu. Najlepszy styl to być konsekwentnym i podążać za tymi, którzy przyszli przed tobą.
Eric

2
+1 Dokumentacja interfejsu API jQuery też. To był jedyny powód, dla którego zdecydowałem się na podwójne cytaty. Osobiście uważam, że odpowiedzi „sprowadzają się do osobistych preferencji” są nieco wadliwe - najlepiej znaleźć powszechnie stosowaną konwencję i trzymać się jej. A ponieważ mogę chcieć skopiować i wkleić przykłady z jQuery (bezpośrednio lub pośrednio), nie chcę za każdym razem zastępować cytatów.
Steve Chambers

2
Być może jQuery nie śledził ludzi przed nimi (lub tak naprawdę nie obchodziło ich, jak większość innych ekspertów). ;)
James Wilkins

14

Zachowaj spójność w tym, czego używasz. Ale nie obniżaj poziomu komfortu.

"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

Aktualizacja ES6

Korzystanie ze składni literału szablonu .

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

13

To głównie kwestia stylu i preferencji. Istnieje kilka raczej interesujących i przydatnych technicznych eksploracji w innych odpowiedziach, więc być może jedyną rzeczą, którą mógłbym dodać, jest udzielenie drobnych światowych rad.

  • Jeśli jesteś kodowania w firmie lub zespole, wtedy to chyba dobry pomysł, aby postępować zgodnie z „domu styl”.

  • Jeśli jesteś sam hacking kilka projektów ubocznych, a następnie spojrzeć na kilka wybitnych liderów w społeczności. Powiedzmy, że wchodzisz do Node.js. Rzuć okiem na podstawowe moduły, np. Underscore.js lub express, i zobacz, jakiej konwencji używają, i rozważ przestrzeganie tego.

  • Jeżeli obie konwencje są jednakowo stosowane, następnie odraczać osobistych
    preferencji.

  • Jeśli nie masz osobiste preferencje, a następnie monetą.

  • Jeśli nie masz monetę, następnie piwo jest na mnie;)


13

Mam nadzieję, że nie dodaję coś oczywistego, ale mam zmaga się z Django i Ajax i JSON w tej sprawie.

Zakładając, że w kodzie HTML używasz podwójnych cudzysłowów, jak zwykle powinno być, zdecydowanie sugeruję stosowanie pojedynczych cudzysłowów w pozostałej części w JavaScript.

Więc zgadzam się z @ady, ale z pewną ostrożnością.

Moje podstawowe zdanie: w JavaScript prawdopodobnie nie ma to znaczenia, ale jak tylko osadzisz go w HTML lub w podobny sposób zaczniesz mieć problemy. Powinieneś wiedzieć, co tak naprawdę ucieka, czyta, przekazuje ciąg.

Moja prosta sprawa to:

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>'

Możesz zobaczyć \ w trzecim polu showThis.

Podwójny cytat nie zadziałał!

Jest jasne, dlaczego, ale jest też jasne, dlaczego powinniśmy trzymać się pojedynczych cudzysłowów ... Chyba ..

Ten przypadek jest bardzo prostym osadzaniem HTML, błąd został wygenerowany przez proste kopiowanie / wklejanie z kodu JavaScript „podwójnie cytowanego”.

Aby odpowiedzieć na pytanie:

Staraj się używać pojedynczych cudzysłowów w HTML. Może zaoszczędzić kilka problemów z debugowaniem ...


1
Miałem podobny problem z interpolacją ciągów znaków ES6 (backticks). Mój system kompilacji skompilował go do ciągu podwójnego cudzysłowu, który złamał nagłówek Auth, który pracował z pojedynczymi cudzysłowami!
Jay

12

Nie jestem pewien, czy jest to istotne w dzisiejszym świecie, ale w przypadku treści, które musiały być przetwarzane znaki kontrolne, i pojedynczych cudzysłowów dla łańcuchów, które nie były przetwarzane, używane były podwójne cudzysłowy.

Kompilator uruchomi operację na ciągach z podwójnym cudzysłowem, pozostawiając dosłownie nietknięty pojedynczy ciąg z cudzysłowami. To kiedyś prowadziło do tego, że „dobrzy” programiści decydowali się na stosowanie pojedynczych cudzysłowów dla ciągów, które nie zawierały znaków kontrolnych takich jak \nlub \0(nieprzetworzonych w pojedynczych cudzysłowach) i podwójnych cudzysłowów, gdy potrzebowali parsowania łańcucha (przy niewielkim koszcie w cyklach procesora dla przetwarzanie ciągu).


14
Nie chodzi o to, że rzeczy kiedyś były robione w jeden sposób, a teraz są robione w inny sposób. Różne języki inaczej przetwarzają cytaty, a niektóre działają tak, jak to opisujesz. Ale to pytanie JavaScript . Pojedyncze i podwójne cudzysłowy są traktowane w JavaScript w identyczny sposób (z wyjątkiem tego, że można użyć drugiego typu cudzysłowu w ciągu bez ucieczki). Nie ma mowy o podwójnych cudzysłowach, umożliwiających interpolację znaków kontrolnych lub ciągów znaków. JavaScript nie działa w ten sposób. Znaki kontrolne i sekwencje specjalne działają tak samo, jak cytat, którego używasz.
Michael Geary,

Jako były programista Perla tak myślę, choć wiem, że nie ma to znaczenia w JS.
zkent

12

Jeśli używasz jshint , pojawi się błąd, jeśli użyjesz łańcucha podwójnego cudzysłowu.

Użyłem go przez rusztowanie Yeoman w AngularJS, ale może jest jakiś sposób na skonfigurowanie tego.

Nawiasem mówiąc, podczas obsługi HTML w JavaScript łatwiej jest używać pojedynczego cudzysłowu:

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

I przynajmniej JSON używa podwójnych cudzysłowów do odświeżania ciągów.

Nie ma łatwego sposobu na odpowiedź na twoje pytanie


Czy jshint implementacji zmienił się? ponieważ strona demo wydaje się akceptować albo nie rzucając żadnych ostrzeżeń / błędów i nie mogę znaleźć żadnych opcji, aby ograniczyć użycie jshinta. Być może ta odpowiedź jest nieaktualna lub niedokładna?
Lea Hayes,

jeśli jshint zgłasza błąd dla łańcucha podwójnego cudzysłowu, jest on poważnie uszkodzony. Standard JavaScript określa, co jest poprawne, a nie jakaś zepsuta linijka.
Mecki

10

Mówiąc o wydajności, cytaty nigdy nie będą twoim wąskim gardłem, jednak wydajność jest taka sama w obu przypadkach.

Mówiąc o szybkości kodowania, jeśli używasz 'do ograniczania łańcucha, będziesz musiał unikać "cudzysłowów. Bardziej prawdopodobne jest, że będziesz musiał użyć "ciągu znaków, na przykład:

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

Następnie wolę używać 'do ograniczania łańcucha, więc muszę uciec od mniejszej liczby znaków.


10

Jednym (głupim) powodem używania pojedynczych cudzysłowów jest to, że nie wymagają one naciśnięcia klawisza Shift, aby je wpisać, podczas gdy podwójny cudzysłów tak. (Zakładam, że przeciętny ciąg nie wymaga zmiany znaczenia, co jest rozsądnym założeniem.) Załóżmy, że codziennie koduję 200 wierszy kodu. Może w tych 200 wierszach mam 30 cytatów. Może wpisanie podwójnego cytatu zajmuje 0,1 sekundy więcej niż wpisanie pojedynczego cytatu (ponieważ muszę nacisnąć klawisz Shift). Potem każdego dnia tracę 3 sekundy. Jeśli koduję w ten sposób przez 200 dni w roku przez 40 lat, to zmarnowałem 6,7 godziny życia. Jedzenie do namysłu.


1
Chyba chodzi tu tylko o układ klawiatury w języku angielskim ... Mam niemiecki, muszę zmienić oba. W każdym razie nie rozumiem, dlaczego naciśnięcie klawisza Shift dodaje czasu do procesu. Naciskam shift lewą ręką, a prawy naciskam klawisz cudzysłowu. Zdarza się to w tym samym czasie, dla mnie nie ma różnicy.
codewandler

1
@codewandler Wciąż trzeba naciskać klawisz Shift, nawet jeśli można go nacisnąć równolegle z klawiszem „. Zmusza to użytkownika do przesunięcia palca od jego domyślnej pozycji. Załóżmy na przykład, że piszesz: var description = "This is a \"quick\" test";włączony angielska klawiatura. W przypadku angielskiej klawiatury, mały palec musi przejść z lewego klawisza Shift do klawisza Q w górnym rzędzie zamiast z klawisza A na klawisz Q. Innymi słowy, musi przemieścić się dwukrotnie Nie jestem pewien, gdzie są klawisze na niemieckiej klawiaturze, ale jestem pewien, że istnieje analogiczny przykład
John Kurlak

2
@codewandler Również konieczności wpisywania zmiany, nawet jeśli mogę to zrobić równolegle, nie pozwala lewy mały palec, aby przygotować się do pisania następnego znaku po "w co piszesz.
John Kurlak

1
Pomysł „marnowania czasu” jest trochę głupi, ale pomysł mniej ergonomicznego obciążenia (szczególnie w epoce zespołu tunelu cieśni, itp.) Sprawia, że ​​jest to przyjemny zysk, szczególnie w przypadkach, w których inaczej nie ma znaczenia. Biorąc pod uwagę ponad 1000 wierszy kodu dziennie, może to zaoszczędzić setki codziennych zakrętów.
Beejor

9

Badanie zalet i wad

Na korzyść pojedynczych cytatów

  • Mniej zakłóceń wizualnych.
  • Generowanie HTML: Atrybuty HTML są zwykle rozdzielane podwójnymi cudzysłowami.

elem.innerHTML = '<a href="' + url + '">Hello</a>';
Jednak pojedyncze cudzysłowy są tak samo legalne w HTML.

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

Co więcej, wbudowany HTML jest zwykle anty-wzorcem. Preferuj szablony.

  • Generowanie JSON: W JSON dozwolone są tylko podwójne cudzysłowy.

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

Ponownie nie powinieneś budować JSON w ten sposób. JSON.stringify () często wystarcza. Jeśli nie, użyj szablonów.

Na korzyść podwójnych cytatów

  • Podwójne są łatwiejsze do wykrycia, jeśli nie masz kodowania kolorami. Jak w dzienniku konsoli lub w jakiejś konfiguracji źródła widoku.
  • Podobieństwo do innych języków: W programowaniu powłoki (Bash itp.) Istnieją literały ciągów pojedynczych cudzysłowów, ale znaki ucieczki nie są w nich interpretowane. C i Java używają podwójnych cudzysłowów dla ciągów i pojedynczych cudzysłowów dla znaków.
  • Jeśli chcesz, aby kod był poprawny JSON, musisz użyć podwójnych cudzysłowów.

Na korzyść obu

Nie ma różnicy między nimi w JavaScript. Dlatego możesz korzystać z tego, co jest obecnie wygodne. Na przykład następujące literały ciągów tworzą ten sam ciąg:

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

Pojedyncze cudzysłowy dla ciągów wewnętrznych i podwójne dla zewnętrznych. Pozwala to odróżnić stałe wewnętrzne od ciągów, które mają być wyświetlane użytkownikowi (lub zapisywane na dysk itp.). Oczywiście powinieneś unikać umieszczania tego ostatniego w kodzie, ale nie zawsze można to zrobić.


8

Kolejną rzeczą, którą możesz rozważyć jako powód przejścia z podwójnych cudzysłowów na pojedyncze cudzysłowy, jest wzrost popularności skryptów po stronie serwera. Podczas korzystania z PHP można przekazywać zmienne i analizować funkcje javascript za pomocą ciągów i zmiennych w PHP.

Jeśli napiszesz ciąg znaków i użyjesz podwójnych cudzysłowów dla swojego PHP, nie będziesz musiał uciec od żadnego pojedynczego cudzysłowu, a PHP automatycznie pobierze dla ciebie wartość zmiennych.

Przykład: muszę uruchomić funkcję javascript przy użyciu zmiennej z mojego serwera.

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

Oszczędza mi to wielu kłopotów z radzeniem sobie z łączeniem łańcuchów i mogę skutecznie wywołać javascript z PHP. To tylko jeden przykład, ale może to być jeden z kilku powodów, dla których programiści domyślnie używają pojedynczych cudzysłowów w javascript.

Cytat z dokumentów PHP : „Najważniejszą cechą ciągów cudzysłowów jest to, że nazwy zmiennych zostaną rozwinięte. Szczegółowe informacje można znaleźć w parsowaniu ciągów”.


+1, robię to w moim projekcie MVC.Net, aby podwójne cudzysłowy z C # nie kolidowały z pojedynczymi cudzysłowami z javascript i odwrotnie.
DCShannon,

3
Myślę, że jeśli piszesz JavaScript na swojej stronie z metody klasy PHP, masz większe problemy.
BadHorsie,

6

Są ludzie, którzy twierdzą, że widzą różnice w wydajności: stary wątek listy adresowej . Ale nie mogłem znaleźć żadnego z nich do potwierdzenia.

Najważniejsze jest sprawdzenie, jakiego rodzaju cudzysłowów (podwójnych lub pojedynczych) używasz wewnątrz łańcucha. Pomaga utrzymać niską liczbę ucieczek. Na przykład, gdy pracujesz z HTML w swoich ciągach, łatwiej jest używać pojedynczych cudzysłowów, dzięki czemu nie musisz uciekać od wszystkich podwójnych cudzysłowów wokół atrybutów.


Choć atrybuty można również otoczyć pojedynczymi cudzysłowami :)
Damir Zekić

Masz rację, myślałem, że xml i xhtml przepisują podwójne cudzysłowy otaczające atrybuty, ale dozwolone są pojedyncze cudzysłowy.
Michiel Overeem

6

Używałbym podwójnych cudzysłowów, gdy pojedyncze cudzysłowy nie mogą być użyte i odwrotnie:

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

Zamiast:

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

Co z ciągiem zawierającym zarówno pojedynczy cytat, jak i podwójny cytat, takie jak O'rea „lly
sudhAnsu63

6

W JavaScript nie ma różnicy między pojedynczymi i podwójnymi cudzysłowami.

Specyfikacja jest ważna:

Być może istnieją różnice w wydajności, ale są one absolutnie minimalne i mogą zmieniać się codziennie w zależności od implementacji przeglądarek. Dalsza dyskusja jest daremna, chyba że twoja aplikacja JavaScript ma setki tysięcy długości.

To jak punkt odniesienia, jeśli

a=b;

jest szybszy niż

a = b;

(dodatkowe spacje)

dziś w określonej przeglądarce i platformie itp.


2
bez spacji jest szybszy. mniej znaków do przeanalizowania w ciągu. : p
pilavdzice

6

Podczas korzystania z CoffeeScript używam podwójnych cudzysłowów. Zgadzam się, że powinieneś wybrać jedno i trzymać się tego. CoffeeScript zapewnia interpolację podczas używania podwójnych cudzysłowów.

"This is my #{name}"

ES6 używa tylnych znaczników (`) do ciągów szablonów. Co prawdopodobnie ma dobry powód, ale przy kodowaniu może być kłopotliwa zmiana znaku literałów łańcuchowych z cudzysłowów lub podwójnych cudzysłowów na tylne tiki, aby uzyskać funkcję interpolacji. CoffeeScript może nie być idealny, ale używanie wszędzie tego samego znaku literałów łańcuchowych (podwójne cudzysłowy) i zawsze możliwość interpolacji to miła cecha.

`This is my ${name}`

Dla mnie tyknięcie z tyłu jest wyraźnym zwycięzcą w tym konkursie, (prawie) brak obecności w typowych ciągach tekstowych oraz interpolacja var
Simone Poggi

5

Jeśli przeskakujesz do tyłu między JavaScript a C #, najlepiej wytrenuj palce, aby znaleźć wspólną konwencję, która jest podwójnym cudzysłowem.


5

Uruchomiłem następujące około 20 razy. I wydaje się, że podwójne cudzysłowy są o około 20% szybsze.

Zabawne jest to, że jeśli zmienisz część 2 i część 1, pojedyncze cudzysłowy są o około 20% szybsze.

//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
Innymi słowy, okazało się, że późniejszy kod działa najszybciej. Jest to problem podczas wykonywania mikro-testów. Musisz uwzględnić silnik JS optymalizujący kod podczas jego działania. (Ten sam efekt zobaczysz podczas testowania Java ze względu na działanie JIT.)
David Phillips

4
pierwsza nowa data jest wolna, dodaj var dummy_date = new Date()do początku
Lauri

1
Poziom mikrooptymalizacji tutaj jest tak głupi, że można również argumentować, że pojedyncze cudzysłowy są szybsze do pisania, co prowadzi do szybszego rozwoju.
Beejor

4

Nie ma żadnej różnicy, więc jest to głównie kwestia gustu i tego, co znajduje się w ciągu (lub jeśli sam kod JS jest w ciągu), aby utrzymać niską liczbę ucieczek.

Legenda różnicy prędkości może pochodzić ze świata PHP, w którym oba cytaty mają różne zachowania.


I Ruby, mogę dodać. Python zachowuje się tak samo jak JavaScript: nie ma różnicy między pojedynczymi / podwójnymi cudzysłowami.
Damir Zekić

4

Po przeczytaniu wszystkich odpowiedzi, które mówią, że może to być szybsze lub może mieć zalety, powiedziałbym, że podwójne cytowanie jest lepsze, a może także szybsze, ponieważ kompilator zamykający Google konwertuje pojedyncze cudzysłowy na podwójne.


Czy wiesz dlaczego to robi?
ma11hew28,

Nie wiem Może to konwencja kodowania i nic specjalnego.
Mohsen

4

Teraz, gdy jest rok 2020, powinniśmy rozważyć trzecią opcję dla Javascript: Pojedynczy backtick na wszystko.

Można tego używać wszędzie zamiast pojedynczych lub podwójnych cudzysłowów.

Pozwala robić wszystkie rzeczy!

  1. Umieść w nim pojedyncze cytaty: „To świetnie!”
  2. Umieść w nim podwójne cudzysłowy: „To„ naprawdę ”świetnie!”
  3. Użyj interpolacji ciągów: `To„ $ {lepiej} ”niż świetnie!`
  4. Pozwala na wiele linii: `

    To

    Sprawia, że

    JavaScript

    Lepszy!

    `

Nie powoduje również utraty wydajności podczas wymiany dwóch pozostałych: https://medium.com/javascript-in-plain-english/are-backticks-slower-than-other-strings-in-javascript-ce4abf9b9fa


3

Jeśli źródłem JS jest:

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

Źródłem HTML będzie:

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

lub dla HTML5

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

JS zezwala na takie tablice:

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

Ale jeśli go skretyzujesz, będzie to zgodne z uzasadnionym powodem:

JSON=["this","that"]

Jestem pewien, że to zajmie trochę czasu.


3

Żeby dodać moje 2 centy: pracując z JS i PHP kilka lat temu, przyzwyczaiłem się do używania pojedynczych cudzysłowów, aby móc wpisać znak zmiany znaczenia ('\') bez konieczności ucieczki. Zwykle używałem go podczas pisania nieprzetworzonych ciągów ze ścieżkami plików itp. ( Http://en.wikipedia.org/wiki/String_literal#Raw_strings )

W każdym razie moja konwencja stała się użyciem pojedynczych cudzysłowów na nieprzetworzonych ciągach znaków identyfikatora, takich jak if (typeof s == 'string') ...(w których znaki specjalne nigdy nie byłyby używane - nigdy), i podwójnych cudzysłowów dla tekstów , takich jak „Hej, co słychać?”. Używam też pojedynczych cudzysłowów w komentarzach jako konwencji typograficznej do wyświetlania nazw identyfikatorów. Jest to tylko ogólna zasada i przerywam tylko wtedy, gdy jest to potrzebne, na przykład podczas pisania ciągów HTML '<a href="#"> like so <a>'(chociaż tutaj można również odwrócić cytaty). Wiem także, że w przypadku JSON w nazwach używane są podwójne cudzysłowy - ale poza tym osobiście wolę pojedyncze cudzysłowy, gdy ucieczka nie jest wymagana dla tekstu między cudzysłowami - jak document.createElement('div').

Podsumowując, i jak niektórzy wspominali / nawiązywali do nich, wybierz konwencję, trzymaj się jej i odchylaj tylko w razie potrzeby.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.