Pytanie Kiedy używać podwójnych lub pojedynczych cudzysłowów w JavaScript?


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

Widzę coraz więcej bibliotek JavaScript za pomocą pojedynczych cudzysłowów podczas obsługi łańcuchów. Jakie są powody, aby używać jednego nad drugim? Myślałem, że są dość wymienne.


1688


pochodzenie


który jest łatwiejszy do odczytania? alert ("It's game time"); lub alert ("czas gry"); - Ryan Miller
A co powiesz o tym Ryanie? alert("It's \"game\" time."); lub alert('It\'s "game" time.');? - Francisc
Jeśli pojedyncze cytaty są zawsze używane, a czasami podwójne cudzysłowy, w których literał zawiera pojedynczy cytat, wtedy będziemy musieli wpisać znacznie mniej przycisków zmiany, a nasz lewy mały palec da nam błogosławieństwo. Ale tak, jak powiedział @arne, należy użyć podwójnego cudzysłowu JSON. - IsmailS
Pojedyncze cytowanie jest łatwiejsze, gdy jesteś na europejskiej klawiaturze (podwójny cytat to Shift + 2, który nie jest tak słodki jak dotknięcie pojedynczego klawisza wygodnie po prawej stronie). - Arne
@Arne Nie ma czegoś takiego jak "klawiatura europejska". Na przykład. Niemiecka klawiatura wymaga przesunięcia dla obu typów ofert. (Ale pojedyncze cytaty są łatwiejsze.) - ANeves


Odpowiedzi:


Najbardziej prawdopodobną przyczyną użycia pojedynczej vs podwójnej w różnych bibliotekach jest preferencja programisty i / lub spójność API.

Poza tym, że jest zgodny, użyj tego, który najlepiej pasuje do ciągu znaków :.

Używanie innego typu cytatu jako literału:

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

... ale może się to 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-tick postać:

alert(`Use "double" and 'single' quotes in the same string`);
alert(`The escape the \` back-tick character in a string`);

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


1044



Ważny punkt do zapamiętania ze wszystkimi konwencjami kodów - Zdefiniuj go raz i pozostań przy nim. IOW, nie używaj podwójnych cudzysłowów gdzie indziej i pojedynczych cudzysłowów gdzie indziej. - Cerebrus
@Cerebrus - Myślę, że elastyczność jest w porządku z tym. Z pewnością wybierz preferowany styl, ale jeśli chcesz oderwać się od stylu, aby zaoszczędzić wiele cytatów w jednym ciągu. Byłbym w porządku z tym. - Martin Clarke
@Mathias Bynens: Nie możesz udowodnić nieistnienia czegoś. Udowodnij, że tam jest przewaga jednego, to jest droga. ;) - Pascal
jsfiddle.net/5HhWF/1 Nie widzę różnicy w prędkości (chrom) - Olly Hicks
@Pascal Myślę, że żartował. I było zabawnie. - ACK_stoverflow


Jeśli masz do czynienia z JSON, należy zauważyć, że ściśle rzecz biorąc, ciągi JSON muszą być podwójnie cytowane. Oczywiście, wiele bibliotek obsługuje również pojedyncze cytaty, ale miałem wielki problem w jednym z moich projektów, zanim zdałem sobie sprawę, że pojedyncze cytowanie ciągu jest w rzeczywistości niezgodne ze standardami JSON.


569



Jest to bardzo istotne przy pracy z jQuery.ajax wywoływaniem w usłudze ASP.NET (usługa sieci Web, metoda strony lub MVC). - Schmuli
Nazwy właściwości w ciągu ciągi JSON muszą być podwójnie cytowane, ale ciąg znaków JSON jako całość może być cytowany pojedynczo: var jsonString = '{"key1":"value1"}'; (Nie zalecam ręcznego budowania JSON.) - nnnnnn
Nie powinieneś pisać JSON ręcznie, jeśli możesz .stringify() to. - Camilo Martin
To właśnie tutaj jest najlepszy argument na to, że zawsze używamy podwójnych cudzysłowów. JSON powinien mieć podwójne cudzysłowy. Pozostałe odpowiedzi w większości dotyczą porady "być konsekwentnym", co oznacza, że ​​jeśli jakakolwiek część języka może realistycznie wymusić podwójny cudzysłów, należy konsekwentnie używać tego podwójnego cudzysłowu. - Josh from Qaribou
Ma to również znaczenie w przypadku pracy z wieloma językami, w których prawie wszystkie inne języki (Java, C, C ++, ...) używają podwójnych cudzysłowów dla łańcuchów i pojedynczych cudzysłowów dla znaków. Wolę używać tego samego cytatu na całej tablicy i trzymać się podwójnych cytatów dla JS. Po latach pisania na klawiaturze dodatkowy klucz do przesunięcia w cudzysłowach jest całkowicie nieistotny, a jeśli twoje kodowanie jest ograniczone przez pisanie, musisz ćwiczyć prawidłowe pisanie. - Lawrence Dol


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

  • Nowo przybyli będą już zaznajomieni z podwójnymi cytatami ze swojego języka. W języku angielskim musimy używać podwójnych cudzysłowów " zidentyfikować fragment cytowanego tekstu. Gdybyśmy mieli użyć pojedynczego cudzysłowu ', czytelnik może błędnie zinterpretować to jako skurcz. Inne znaczenie fragmentu tekstu otoczonego ' wskazuje na "potoczne" znaczenie. Sensownym jest pozostawanie w zgodzie z wcześniej istniejącymi językami, co może ułatwić naukę i interpretację kodu.
  • Podwójne cytaty eliminują potrzebę ucieczki od apostrofów (jak w przypadku skurczów). Rozważmy ciąg: "I'm going to the mall", w odróżnieniu od wersji z alternatywnym wyjściem: 'I\'m going to the mall'.
  • Podwójne cudzysłowy oznaczają ciąg w wielu innych językach. Gdy uczysz się nowego języka, takiego jak Java lub C, zawsze używane są podwójne cudzysłowy. W Ruby, PHP i Perl, łańcuchy o pojedynczych cudzysłowach nie oznaczają ucieczek ukośników, a podwójne cudzysłowy je obsługują.

  • Notacja JSON jest pisana podwójnymi cytatami.

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


244



Twoja pierwsza uwaga dotycząca języka angielskiego nie zawsze jest prawdziwa i może się zmieniać w zależności od konwencji miejsca / domu. Materiały drukowane zazwyczaj używają pojedynczych cudzysłowów do wymowy i używają innych formatów dla dużych bloków cytowanego tekstu. Twoje "potoczne" znaczenie nie jest przydatną definicją cytatów dla podkreślenia. Plus angielscy użytkownicy są ogólnie bardzo słabi z cudzysłowami i apostrofami. - John Ferguson
@ John Ferguson, tylko z tego powodu, może być pożądane użycie podwójnych cudzysłowów, aby dokonać takiego zróżnicowania (między apostrofami i cytowanymi fragmentami). - user1429980
Już wcześniej faworyzowałem pojedyncze cytaty, a to mogło przekonać mnie do podwójnego cytowania mojego następnego projektu ... Dzięki - A5308Y
Chodzi mi o pragmatyzm. Ze względu na to, że 1 na 100 ciągów, które piszę lub używa, ma podwójne cudzysłowy, a wiele, wiele innych ma apostrofy, używam podwójnych. Pod koniec dnia powinieneś jednak użyć typu oferty 1) już używanego w projekcie, jeśli jesteś nowym programistą projektu lub 2) użyć tego, który uważasz za bardziej sensowny. - dudewad
Przypadek - to, co właśnie napisałem (jest wiele apostrofów, nie ma podwójnych cudzysłowów;) - dudewad


The tylko różnica jest wykazana w następujący sposób:

'A string that\'s single quoted'

"A string that's double quoted"

Tak więc zależy to tylko od tego, ile chcesz wycisnąć z cudzysłowu. Oczywiście to samo dotyczy podwójnych cudzysłowów w cudzysłowach.


112



Jak możesz być pewien, że to jedyna różnica? - Mathias Bynens
Gareth ma rację. Nie myślałem o tym - anonymous coward
@Mathias - sekcja 7.8.4 specyfikacji [ecma-international.org/publications/standards/Ecma-262.htm] opisuje literalną notację łańcuchową, jedyną różnicą jest to, że DoubleStringCharacter to "SourceCharacter, ale nie podwójny cytat", a SingleStringCharacter to "SourceCharacter, ale nie pojedynczy cytat" - Gareth
@Mathias - Ok, rozumiem twój punkt widzenia i chociaż bardzo chciałbym myśleć, że programy JavaScript są zoptymalizowane do tego stopnia, że ​​powoduje to wymierną różnicę (a nawet wtedy, pozostawia się to kaprysom konkretnego tłumacza), Jestem po prostu trochę cyniczna. - Gareth
Co powiesz na "{\"name\": \"Peter\"}" vs '{"name": "Peter"}'? Wprawdzie można powiedzieć, że jest to ta sama różnica, ale z pewnością wpłynęłoby to na twoją decyzję w inny sposób niż powyższy przykład. - Trevor


Pojedyncze cytaty

Chciałbym, żeby podwójne notowania były standardem, ponieważ one uczynić trochę więcej sensu, ale wciąż używam pojedynczych cudzysłowów, ponieważ dominują na scenie.

Pojedyncze cytaty:

Bez preferencji:

Podwójne cytaty:


68



Crockford teraz preferuje podwójne cytaty. - Adam Calvet Bohl
Google teraz preferuje podwójne cytaty - Suraj Jain
airbnb teraz preferuje podwójne cytaty - Suraj Jain
@ SurajJain Source? Airbnb i Google prowadnice stylów nadal są wyświetlane jako preferowane. - Olegs Jeremejevs
@SurajJain Ah, są to konfiguratory sprawdzania stylu kodu napisane w JSON, które w ogóle nie pozwalają na pojedyncze cudzysłowy. Ich czytanie jest dobrym sposobem na porównanie wyborów dokonanych przez różne projekty. - Olegs Jeremejevs


Chciałbym powiedzieć, że różnica jest czysto stylistyczna, ale naprawdę mam wątpliwości. Rozważmy 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, Operze i Internet Explorerze (testowane w IE7 i IE8) zwróci to:

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

Jednak Firefox przyniesie 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 cudzysłowami. (Zwróć także uwagę na to, że przestrzeń wcięcia została zastąpiona czterema spacjami). Daje to wrażenie, że co najmniej jeden przeglądarka parsuje wewnętrznie JavaScript tak, jakby wszystko zostało napisane przy pomocy podwójnych cudzysłowów. Ktoś mógłby pomyśleć, że Firefox poświęca mniej czasu na parsowanie JavaScriptu, jeśli wszystko jest już napisane zgodnie z tym "standardem".

Co, nawiasem mówiąc, czyni mnie 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 ma to sens tylko wtedy, gdy to samo dotyczy JavaScript.

Wniosek: Uważam, że powinniśmy przeprowadzić więcej badań w tej sprawie.

Edytować: To może wyjaśnić Wyniki testu Petera-Paula Kocha od tyłu w 2003 roku.

Wydaje się, że pojedyncze cytaty są czasami szybciej w Eksploratorze Windows (około 1/3 moich testów wykazało szybszy czas odpowiedzi), ale jeśli Mozilla pokazuje różnicę, to obsługuje ona nieco więcej podwójnych cytatów. Nie znalazłem żadnej różnicy w Operze.

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


54



Jeśli jest nieco szybszy w jednej przeglądarce, aby zrobić to w jeden sposób, a nieco szybciej w innym, aby zrobić to w drugą stronę, wydaje się, że jedyne wskazówki, które możemy odjąć od tego, to że powinniśmy robić, co chcemy bardziej, ponieważ to zrani trochę użytkowników i pomagają innym, a różnica może być niedostrzegalna. "Przedwczesna optymalizacja ..." i tak dalej. - Andrew Hedges
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 ma niewiele wspólnego z jej analizą, a zatem prawdopodobnie nie jest powodem, aby preferować jeden typ cytatów nad drugim. Dane wydajnościowe porównujące czasy analiz pojedynczych i podwójnych cudzysłowów w różnych przeglądarkach byłyby jednak bardziej przekonujące. - Chris Calo
To jest niesamowita odpowiedź, przerwa od reszty, która brzmi "Są takie same". "Plus, w innych językach programowania, są zwykle szybsze w użyciu niż podwójne cudzysłowy", Czy mogę zapytać, które języki? Użył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. Obudowy z pojedynczymi cudzysłowami są zwykle używane tylko dla stałych znaków (dozwolony jest tylko jeden znak). - ADTC
AFAIK zostało to naprawione w Firefoksie 17, Firefox używał do dekompilacji .toString ale teraz zwraca oryginalną kopię. Nowoczesny firefox nie będzie miał tego problemu. - Benjamin Gruenbaum
Nie wiem o różnicach prędkości. Ale chciałbym zauważyć, że "To sprawia wrażenie, że co najmniej jeden przeglądarka parsuje wewnętrznie JavaScript tak, jakby wszystko było pisane podwójnymi cudzysłowami." to nonsens. Znika jak przy pisaniu podwójnymi cudzysłowami. To jest jego wewnętrzna reprezentacja (która tylko przechowuje ciąg, a nie cytaty) w wersji czytelnej dla człowieka, dla której używa się jednego zestawu cytatów. W każdym razie wydaje się, że to się zmieniło, zgodnie z komentarzem Benjamina. - subsub


Jeśli robisz wbudowany JavaScript (prawdopodobnie "zła" rzecz, ale unikaj tej dyskusji) pojedynczy Cytaty są jedyną opcją dla literałów ciągowych, jak sądzę.

np. działa to dobrze:

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

Ale nie możesz zawrzeć "cześć" w podwójnych cudzysłowach, za pomocą jakiejkolwiek metody ucieczki, której jestem świadomy. Parzysty &quot; który byłby moim najlepszym przypuszczeniem (ponieważ wymykasz się wycenom w wartości atrybutu HTML) nie działa dla mnie w Firefoksie. \" nie zadziała, ponieważ w tym momencie uciekasz w poszukiwaniu HTML, a nie JavaScript.

Jeśli więc nazwa gry jest spójna i zamierzasz wstawić JavaScript w niektórych częściach aplikacji, myślę, że pojedyncze cytaty są zwycięzcami. Niech ktoś mnie poprawi, jeśli się mylę.


30



Uzgodniono, że jest to coś złego, ale jeśli trzeba to zrobić, jestem całkiem pewny, że można użyć kodowania w stylu URL, np. <a onclick="alert(%22hi%22);">hi</a> - z pamięci to działa, chociaż mogło być w atrybucie href <a href="javascript:alert(%22hi%22);">hi</a> - Graza
<a onclick='alert("hi");'>hi</a> też jest legalne ... - PhiLho
<a onclick="alert(&quot;hi&quot;)"> pracuje dla mnie.. - Robert
@ Tom Lianza, z pewnością alert(&quot;hi&quot;) nie jest poprawny JavaScript. Ale wartości atrybutów są kodowane. w3.org/TR/html4/intro/sgmltut.html#didx-attribute - Robert
Uzgodniono z @Robert tutaj. &quot;to poprawny sposób na uniknięcie podwójnego cudzysłowu wewnątrz atrybutu HTML. Działa dobrze w Firefoksie. @Denilson, XML (a zatem XHTML) umożliwia zarówno pojedyncze, jak i podwójne cudzysłowy. Zobacz AttValue dosłownie w specyfikacji XML na w3.org/TR/REC-xml/#d0e888. - Chris Calo


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 znakó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 ostrzeżenia).

Osobiście to śledzę.

AKTUALIZACJA: Wygląda na to, że pan Crockford zmienił zdanie i teraz zaleca używanie podwójnych cytatów przez cały czas :)


29



Douglas Crockford vs JQuery. Wybierz swoją truciznę. - Eric
Co to jest rozumowanie Crockforda? - BadHorsie
Jest to konwencja, którą podążam. To bardziej osobiste preferencje. Lubię używać ciągów z pojedynczym cudzysłowem dla wewnętrznych rzeczy, takich jak selektory jQuery i / lub rzeczy takie jak getElementById ('id') ;, po prostu podoba mi się sposób, w jaki wygląda z pojedynczymi cudzysłowami. Przejdź do podwójnego cudzysłowu dla tekstu zewnętrznego, ponieważ często może zawierać wewnętrzne cytaty w tekście. Ponadto ułatwia wykrycie i rozróżnienie między ciągami zewnętrznymi a wewnętrznymi, jeśli próbujesz znaleźć błąd w jednym lub drugim. - adimauro
Od kwietnia 2016 r. Douglas Crockford teraz poleca tylko w podwójnych cudzysłowach, zważywszy, że w praktyce wielu twórców uznało, że trudno jest użyć wewnętrznej i zewnętrznej dychotomii. - Thunderforge
Dzięki @Thunderforge dla tej aktualizacji - Mariusz Nowak


Ś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 wybór:

  • Styl domu: niektóre grupy programistów używają już jednej konwencji lub drugiej.
  • Wymagania po stronie klienta: Czy będziesz używać cudzysłowów w ciągu znaków? (Patrz odpowiedź Ady'ego).
  • Język po stronie serwera: ludzie VB.Net mogą używać pojedynczych cudzysłowów dla skryptów java, aby skrypty mogły być budowane po stronie serwera (VB.Net używa podwójnych cudzysłowów dla łańcuchów, więc łańcuchy znaków java są łatwe do rozróżnienia jeśli używają pojedynczych cudzysłowów).
  • Kod biblioteki: jeśli używasz biblioteki korzystającej z określonego stylu, możesz rozważyć użycie tego samego stylu.
  • Osobiste preferencje: Możesz pomyśleć, że jeden lub drugi styl wygląda lepiej.

24



Nie prawda, ' jest 00100111 w binarnym, podczas gdy " jest 00100010 w binarnym. W ten sposób podwójne cudzysłowy zużywają o połowę mniej energii niż pojedyncze cudzysłowy. Taka jest różnica.


Zobaczmy, co robi odniesienie.

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

Tak więc, począwszy od teraz, użyję podwójnie cytowanych ciągów. (Używałem singla!)


18



Dlaczego to jest głosowane. Jest to kwestia stylu, a najlepszy styl to być konsekwentnym i podążać za tymi, którzy byli przed wami. - Eric
+1 Dokumentacja API jQuery też robi. To był jeden powód, dla którego zdecydowałem się na podwójny cytat. Osobiście uważam, że odpowiedzi, które "sprowadzają się do osobistych preferencji" są nieco wadliwe - najlepiej jest znaleźć powszechnie używaną konwencję i trzymać się jej. A ponieważ mogę chcieć skopiować i wkleić przykłady z jQuery (bezpośrednio lub pośrednio), nie chcę zastępować cytatów za każdym razem. - Steve Chambers
Być może jQuery nie podążał za ludźmi przed nimi (lub tak naprawdę nie obchodziło to, jak większość innych ekspertów). ;) - James Wilkins
Ale Angular ... (żartuję: P) - Jin Wang
lol nie suer, jeśli poważny - Spets


Mam nadzieję, że nie dodaję czegoś oczywistego, ale zmagałem się z tym Django i Ajax i JSON na ten temat.

Zakładając, że w kodzie HTML używasz podwójnych cudzysłowów, jak zwykle powinno być, bardzo polecam używanie cudzysłowów do reszty w JavaScript.

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

Moja ostatnia linijka to: W JavaScript prawdopodobnie nie ma to znaczenia, ale zaraz po osadzeniu to wewnątrz HTML lub podobnego problemu zaczynają się kłopoty. Powinieneś wiedzieć co właściwie ucieka, czyta, przekazuje twój ciąg.

Mój prosty przypadek to:

tbox.innerHTML = tbox.innerHTML + '<div class="thisbox_des" style="width:210px;" onmouseout="clear()"><a href="/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 znaleźć \ 'w trzecim polu showThis.

Podwójny cytat nie działa!

Jasne jest, dlaczego, ale jest też jasne, dlaczego powinniśmy trzymać się pojedynczych cytatów ... .. Zgaduję..

Przypadek ten jest bardzo prostym osadzeniem HTML, błąd został wygenerowany przez proste skopiowanie / wklejenie z "podwójnie cytowanego" kodu JavaScript.

Aby odpowiedzieć na pytanie:

Spróbuj użyć pojedynczych cudzysłowów w HTML. Może to uratować kilka problemów z debugowaniem ...


13



Wpadłem na podobny problem z interpolacją ciągów ES6 (backticks). Mój system kompilacji skompilował go do podwójnego łańcucha, który złamał nagłówek Auth, który pracował z pojedynczymi cudzysłowami! - Jay