Soru JavaScript'te çift veya tek tırnak kullanıldığında ne zaman?


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

Dizeleri tutarken tek tırnak kullanarak daha fazla JavaScript kitaplığı görüyorum. Birini diğerinin kullanmanın sebepleri nelerdir? Oldukça fazla değiştirilebilir olduklarını sanıyordum.


1688


Menşei


okumak daha kolay? uyarısı ("Bu oyun zamanı"); veya uyarı ('Bu oyun zamanı'); - Ryan Miller
Bu Ryan'a ne dersin? alert("It's \"game\" time."); veya alert('It\'s "game" time.');? - Francisc
Eğer tek tırnaklar her zaman kullanılırsa ve zaman zaman tek harfli alıntılar içeren çift tırnak işaretleri varsa, o zaman çok daha az vardiya düğmeleri yazmalıyız ve sol küçük parmağımız bize nimet verecektir. Ama evet, @arne'ın dediği gibi, JSON çift alıntı kullanılmalıdır. - IsmailS
Tek bir alıntı yapmak, bir avrupa klavyesi üzerindeyken yapmaktan daha kolaydır (çift tırnak, sağ pembeniz tarafından tek bir tuşa dokunmak kadar hoş olmayan Shift + 2'dir). - Arne
@Arne "Avrupa klavyesi" diye bir şey yoktur. Örneğin. Almanca klavye her iki tür tırnak için de kayma gerektirir. (Ama tek tırnaklar daha kolay.) - ANeves


Cevaplar:


Farklı kütüphanelerde tek ve çift kullanımının en olası nedeni programcı tercihi ve / veya API tutarlılığıdır.

Tutarlı olmanın dışında, dizeye en uygun olanı kullanın:

Bir basım olarak diğer alıntı tipini kullanarak:

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

… Ama bu karmaşıklaşabilir…

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

ES6’da yeni bir seçenek daha: Şablon değişmezleri hangi kullanır back-tick karakter:

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

Şablon değişmezleri, aşağıdakiler için temiz bir sözdizimi sunar: değişken enterpolasyon, çok satırlı dizeler ve daha fazlası.


1044



Tüm kod kurallarına dikkat edilmesi gereken önemli bir nokta - Bir kez tanımlayın ve ona yapıştırın. IOW, başka yerde bir yere çift tırnak ve tek tırnak kullanmayın. - Cerebrus
@Cerebrus - Bence bu konuda esneklik var. Tercih edilen stili seçin, ancak bir dizgede çok fazla alıntı bırakmak için stilden ayrılmanız gerekiyorsa. Bununla iyi olurum. - Martin Clarke
@Mathias Bynens: Bir şeyin varlığını kanıtlayamazsınız. Bunu kanıtla olduğu Her ikisi için bir avantaj, bu gitmek için yol. ;) - Pascal
jsfiddle.net/5HhWF/1 Hızda fark görmüyorum (krom) - Olly Hicks
@Pascal Sanırım şaka yapıyordu. Ve komikti. - ACK_stoverflow


JSON ile uğraşıyorsanız, kesinlikle konuşmak gerekirse, JSON dizelerinin çift tırnak içine alınması gerektiğini unutmayın. Tabii ki, birçok kütüphane de tek bir alıntıyı destekliyor, ancak bir diziden alıntı yapılmasının JSON standartlarına göre gerçek olmadığını anlamamdan önce projelerimden birinde büyük sorunlar yaşadım.


569



Bu, bir ASP.NET hizmetine (Web Hizmeti, Sayfa Yöntemi veya MVC) jQuery.ajax çağrısıyla çalışırken çok önemlidir. - Schmuli
Mülkiyet isimleri içinde JSON dizeleri çift tırnak içine alınmalıdır, ancak bir bütün olarak bir JSON dizgisi tek tırnaklı olabilir: var jsonString = '{"key1":"value1"}'; (JSON'u manuel olarak oluşturmanızı tavsiye etmiyorum.) - nnnnnn
Eğer yapabiliyorsanız JSON'u elle yazmamalısınız .stringify() o. - Camilo Martin
Buradaki doğru, her zaman çift tırnak kullanmak için en iyi argüman. JSON çift tırnak olmalıdır. Diğer cevaplar çoğunlukla “tutarlı olmak” için tavsiyede bulunur, yani eğer dilin herhangi bir kısmı gerçekçi bir şekilde çift alıntı yapabilirse, bu ikili alıntıyı sürekli olarak kullanmalısınız. - Josh from Qaribou
Bu, hemen hemen tüm diğer dillerin (Java, C, C ++, ...) dizgiler için çift tırnak ve chars için tek tırnak kullanacağı birden çok dille çalışırken de geçerlidir. Ben aynı alıntıyı tahtada kullanmayı tercih ediyorum ve bu yüzden JS için çift tırnak ile yapıştırın. Yıllar süren bir dokunuşla çift tırnak yazmak için ekstra tuşa basmak tamamen ilgisizdir ve kodlamanız yazmanızdan dolayı kısıtlanıyorsa, yazmayı düzgün bir şekilde yapmanız gerekir. - Lawrence Dol


Daha iyi bir çözüm yok; ancak, çift tırnakların zaman zaman daha cazip olabileceğini tartışmak isterim:

  • Yeni gelenler kendi dillerinden çift tırnak kullanmayı çoktan biliyor olacaklar. İngilizce olarak, çift tırnak kullanmalıyız " alıntılanan metnin bir geçişini tanımlamak için. Tek bir teklif kullanacak olsaydık 'okuyucu bunu bir kasılma olarak yorumlayabilir. Çevrilmiş bir metin geçişinin diğer anlamı ' 'konuşma dili' anlamına gelir. Mevcut dillerle tutarlı kalmak mantıklıdır ve bu muhtemelen kodun öğrenilmesini ve yorumlanmasını kolaylaştırabilir.
  • Çift tırnak kesme kaçış ihtiyacını ortadan kaldırır (kasılmalarda olduğu gibi). Dizeyi düşünün: "I'm going to the mall", aksi halde kaçtı sürümüne karşı: 'I\'m going to the mall'.
  • Çift tırnak, diğer birçok dilde bir dize anlamına gelir. Java veya C gibi yeni bir dil öğrendiğinizde, çift tırnak kullanılır. Ruby, PHP ve Perl'de, tek tırnaklı dizeler, çift tırnak işareti onları desteklerken ters eğik çizgi çıkmaz.

  • JSON notasyonu çift tırnak ile yazılmıştır.

Bununla birlikte, diğerlerinin de belirttiği gibi, tutarlı kalmak en önemli şeydir.


244



İngilizce dili ile ilgili ilk noktanız her zaman doğru değildir ve yerellik / ev konvansiyonuna bağlı olarak değişebilir. Basılı materyaller genellikle konuşma için tek tırnak kullanır ve büyük miktardaki alıntılanmış metin blokları için diğer formatları kullanır. 'Topluluğun' anlamı, vurgu için alıntıların yararlı bir tanımı değildir. Artı İngilizce kullanıcıları genellikle tırnak işaretleri ve kesme işaretleri ile çok zayıf. - John Ferguson
@JohnFerguson, bu nedenle tek başına, bu farklılaşmayı yapmak için çift tırnakların kullanılması istenebilir (kesme işaretleri ve alıntılanmış geçişler arasında). - user1429980
Ben daha önce tek tırnaklar lehine oldum ve bu sadece bir sonraki projem için çift tırnak kullanmayı bana ikna etmiş olabilir. - A5308Y
Ben pragmatizm hakkında her şeyim. Yazdığım veya kullandığı 100 dizekteki 1 karakterin çift tırnak işareti olduğu ve birçoğunun çoğunun kesme işareti olduğu gerçeği nedeniyle, iki misli kullanıyorum. Ancak, günün sonunda, projeye yeni bir geliştirici iseniz, projede halihazırda kullanımda olan alıntı tipini kullanmalısınız, ya da 2) daha mantıklı olduğunu düşündüğünüz birini kullanın. - dudewad
Noktadaki durum-- ben sadece yazdım (birden fazla kesme işareti var, çift tırnak yok;) - dudewad


bir tek fark aşağıdaki şekilde gösterilmiştir:

'A string that\'s single quoted'

"A string that's double quoted"

Yani, sadece kaç alıntı yapmaktan kaçınmak istiyorsun. Açıkçası aynı çift tırnaklı dizgelerde çift tırnak için de geçerlidir.


112



Tek farkın bu olduğundan nasıl emin olabilirsiniz? - Mathias Bynens
Gareth iyi bir nokta yapar. Bunu düşünmedim - anonymous coward
@Mathias - şartnamenin 7.8.4 bölümü [ecma-international.org/publications/standards/Ecma-262.htm] literal dize gösterimini açıklar, tek fark DoubleStringCharacter'ın "SourceCharacter değil, double-quote" olmasıdır ve SingleStringCharacter "SourceCharacter değil, single-quote" dir. - Gareth
@Mathias - Tamam, noktanızı görüyorum ve JavaScript programlarının ölçülebilir bir fark yarattığı noktaya kadar optimize edildiğini düşünürken (ve o zaman bile, bu belirli bir tercümanın kaprislerine bırakılmış), ben ' Sadece bu konuda biraz alaycıyım. - Gareth
Ne dersin "{\"name\": \"Peter\"}" vs '{"name": "Peter"}'? Kuşkusuz, bunun aynı fark olduğunu söyleyebilirdiniz, ancak kararınızı yukarıdaki örnekten farklı bir şekilde etkileyecektir. - Trevor


Tek tırnak

Çift tırnak standart olsaydı, çünkü onlar biraz daha mantıklıama tek tırnak kullanmayı sürdürüyorum çünkü sahneye hakim oluyorlar.

Tek tırnaklar:

Tercih yok:

İkili alıntı:


68



Crockford şimdi çift tırnak tercih ediyor. - Adam Calvet Bohl
google şimdi çift tırnak tercih ediyor - Suraj Jain
Airbnb şimdi çift tırnak tercih ediyor - Suraj Jain
@SurajJain Kaynağı? Airbnb ve Google stil kılavuzları hala beklendiği gibi tek liste. - Olegs Jeremejevs
@SurajJain Ah, bunlar JSON'da yazılmış, tek tırnaklara izin vermeyen kod stili denetleyici yapılandırmalarıdır. Onları okumak, farklı projelerin seçimlerini karşılaştırmanın güzel bir yoludur. - Olegs Jeremejevs


Farkın tamamen üslup olduğunu söylemek isterdim, ama gerçekten şüphelerim var. Aşağıdaki örneği göz önünde bulundurun:

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

Safari, Chrome, Opera ve Internet Explorer'da (IE7 ve IE8'de test edilmiştir), bunlar aşağıdakileri döndürecektir:

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

Ancak, Firefox biraz farklı bir sonuç verecektir:

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

Tek tırnaklar çift tırnak ile değiştirildi. (Ayrıca girinti boşluğunun dört boşlukla nasıl değiştirildiğine de dikkat edin.) Bu, en az bir tarayıcının, her şey çift tırnak kullanılarak yazıldığı şekilde JavaScript'i dahili olarak ayrıştırdığı izlenimini verir. Birisi düşünebilirse, Firefox’un JavaScript’i ayrıştırması daha az zaman alır.

Bu arada, tek tırnakların kodda daha güzel görüneceğini düşündüğümden, bana çok üzücü bir panda geliyor. Ayrıca, diğer programlama dillerinde, genellikle çift tırnaktan daha hızlıdırlar, bu yüzden JavaScript'e aynı uygulandığında sadece anlam ifade eder.

Sonuç: Bunun hakkında daha fazla araştırma yapmamız gerektiğini düşünüyorum.

Düzenle: Bu açıklayabilir Peter-Paul Koch'un test sonuçları 2003'ten itibaren.

Tek tırnaklar görünüyor ara sıra Explorer Windows'da daha hızlı (testlerimin yaklaşık 1 / 3'ü daha hızlı tepki süresi gösterdi), ancak Mozilla bir fark gösterdiğinde, çift tırnakları biraz daha hızlı bir şekilde işler. Opera'da hiçbir fark bulamadım.

2014'ü düzenle: Firefox / Spidermonkey'in modern sürümleri artık bunu yapmıyor.


54



Bir tarayıcıda biraz daha hızlı bir şekilde diğerini yapmak için bir yolu ve biraz daha hızlı bir şekilde yapmak, başka bir şekilde bunu yapmak için tek yol gösterici gibi görünüyor, çünkü daha fazla istediğimiz her şeyi yapmamız gerektiğidir çünkü biraz Kullanıcıları ve başkalarına yardım et, ve farkın miktarının algılanabilir olması olasıdır. "Erken optimizasyon ..." ve tüm bunlar. - Andrew Hedges
Üzgünüm, yorumum daha yapıcı değildi. Sadece, tarayıcının sözdiziminin içsel gösterimini nasıl göstereceğini seçtiğini, muhtemelen nasıl ayrıştırıldığına dair çok az şey olduğunu ve bu nedenle muhtemelen bir diğerinin üzerinde bir tür alıntı yapmayı tercih etmenin bir nedeni olmadığını söylüyorum. Diğer yandan, tarayıcılarda tek ve çift tırnaklar için ayrıştırma zamanlarını karşılaştıran performans verileri daha zorlayıcı olacaktır. - Chris Calo
Bu müthiş bir cevap, geri kalanlardan bir kopuş sadece cıvıltı 'Onlar aynı' onlar aynı '... Sen dedin "Ayrıca, diğer programlama dillerinde, çift tırnak kullanmaktan genellikle daha hızlıdırlar", Hangi dilleri sorabilir miyim? Java ve C # gibi sıradan yayınlar kullandım, tek tırnaklarda dizgi değişmezlerini kabul eden JS'den başka bir tane görmedim. Tek tırnaklı kasalar genellikle sadece karakter sabitleri için kullanılır (sadece bir karaktere izin verilir). - ADTC
AFAIK bu Firefox 17'de düzeltildi, Firefox bunu yaparken dekomplasyon yapmak için kullanıldı .toString ancak şimdi orijinal kopyayı döndürür. Modern firefox bu konuya sahip olmayacak. - Benjamin Gruenbaum
Hız farkları hakkında bilmiyorum. Ancak şunu da belirtmek isterim: "Bu, en az bir tarayıcının, her şey çift tırnak kullanılarak yazılmış sanki içeride JavaScript'i dahili olarak ayrıştırdığı izlenimini verir." saçmalık. Çift tırnak ile yazılmış sanki UNparsed. Bu, bir iç tırnak temsilcisini (tırnakları değil, sadece dizeyi saklar) bir insan tarafından okunabilir bir versiyona dönüştürdü; Her neyse, bu Benjamin'in yorumuna göre değişmiş gibi görünüyor. - subsub


Satır içi JavaScript yapıyorsanız (tartışmasız "kötü" bir şey varsa, ancak bu tartışmadan kaçınarak) tek alıntılar dize edebi için tek seçenek, inanıyorum.

ör., bu iyi çalışır:

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

Ama "merhaba" u çift tırnak içinde, farkında olduğum herhangi bir kaçma yöntemi ile saramazsın. Üstelik &quot; En iyi tahmininiz olurdu (Firefox'taki bir özellik değerindeki alıntılardan kaçıyorsunuz) Firefox'ta benim için çalışmıyor. \" çalışmaz, çünkü bu noktada JavaScript için değil, HTML için kaçıyorsunuz.

Dolayısıyla, oyunun adı tutarlılık gösteriyorsa ve uygulamanızın bazı bölümlerinde satır içi JavaScript yapacaksanız, tek teklifin kazanan olduğunu düşünüyorum. Birisi, eğer yanılıyorsam beni düzeltin.


30



Muhtemelen kötü bir şey olmak konusunda anlaştılar, ancak eğer yapılması gerekiyorsa, eminim URL tarzı kodlama kullanılabilir. <a onclick="alert(%22hi%22);">hi</a> - bellekten bu çalışma, bunun yerine href niteliğinde olmuş olabilir <a href="javascript:alert(%22hi%22);">hi</a> - Graza
<a onclick='alert("hi");'>hi</a> yasal da ... - PhiLho
<a onclick="alert(&quot;hi&quot;)"> benim için çalışıyor.. - Robert
@Tom Lianza, kesinlikle alert(&quot;hi&quot;) geçerli bir JavaScript değil. Ancak öznitelik değerleri kodlanır. w3.org/TR/html4/intro/sgmltut.html#didx-attribute - Robert
Burada Robert ile anlaştılar. &quot; HTML niteliğinde bir çift alıntıdan kaçmanın doğru yolu. Firefox'ta iyi çalışıyor. @Denilson, XML (ve dolayısıyla XHTML) hem tek hem de çift tırnaklara izin verir. Bakın AttValue XML spesifikasyonundaki literal w3.org/TR/REC-xml/#d0e888. - Chris Calo