JavaScriptで二重引用符または単一引用符を使用する場合


1968

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

文字列を処理するときに一重引用符を使用するJavaScriptライブラリが増えています。どちらを使用する理由は何ですか?かなり互換性があると思いました。


125
どちらが読みやすいですか?alert( "ゲームの時間です"); またはalert( 'It \' s game time ');
Ryan Miller

591
このライアンはどうですか?alert("It's \"game\" time.");またはalert('It\'s "game" time.');
Francisc

37
一重引用符を常に使用し、リテラルに一重引用符が含まれる場合がある二重引用符を使用する場合は、入力するシフトボタンをはるかに少なくする必要があり、左小指で祝福を得ることができます。しかし、はい、@ arneが言ったように、JSONには二重引用符を使用する必要があります。
IsmailS 2011年

9
ヨーロッパのキーボードを使用している場合は、単一引用符を使用する方が簡単です(二重引用符はShift + 2で、右の小指で単一のキーをタップするのと同じくらい簡単ではありません)。
Arne

38
@Arne「ヨーロッパのキーボード」というものはありません。たとえば、ドイツ語のキーボードでは、両方のタイプの引用符のシフトが必要です。(ただし、一重引用符の方が簡単です。)
ANevesは

回答:


1222

異なるライブラリでシングルとダブルを使用する最も可能性の高い理由は、プログラマーの好みやAPIの一貫性です。一貫性がある以外は、文字列に最適な方を使用します。

他のタイプの引用符をリテラルとして使用する:

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

これは複雑になる可能性があります。

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

ES6の新機能である別のオプションは、文字を使用するテンプレートリテラルback-tickです。

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

テンプレートリテラルは、変数の補間、複数行の文字列などの明確な構文を提供します。

JSONは二重引用符を使用するように正式に指定されていることに注意してください。システム要件によっては、検討する価値があるかもしれません。


84
すべてのコード規約で注意すべき重要なポイント-一度定義して、それを使い続けます。IOW、どこかに二重引用符を使用し、他の場所に単一引用符を使用しないでください。
セレブラス2009年

170
@Cerebrus-これで柔軟性は大丈夫だと思います。確かに好みのスタイルを選択してください。ただし、エスケープする大量の引用符を1つの文字列に保存するためにスタイルから脱却する必要がある場合。私はそれで大丈夫でしょう。
マーティンクラーク

5
それについて一貫している必要がある理由は何もないと思います。そこのどちらか一方への利点はません、と私は読みやすさは本当にあなたが別の「一つの場所に'を使用しているか否かに影響されるとは思わない。
cdmckay

2
@Olly Hicks、面白いテスト!! Chrome 13(OSX)では、単一引用符は実際には二重引用符よりも数倍高速です。興味深い...
Ricket

12
少し話題外ですが、人々が正しいタイポグラフィを使用している場合、エスケープに関するこれらの多くの議論は時代遅れになります:alert('It’s “game” time')alert("It’s “game” time")-重要ではありません。あなただけのシングルまたはダブルプライム記号(まれ)のケースではエスケープする必要があるだろう'"実際には適切です。
-jotaen

617

JSONを扱う場合、厳密に言うと、JSON文字列は二重引用符で囲む必要があることに注意してください。もちろん、多くのライブラリは単一引用符もサポートしていますが、文字列の単一引用符が実際にはJSON標準に従っていないことに気付く前に、プロジェクトの1つで大きな問題がありました。


5
これは、ASP.NETサービス(Webサービス、ページメソッド、またはMVC)を呼び出すjQuery.ajaxを操作する場合に非常に重要です。
Schmuli

100
JSON文字列のプロパティ名二重引用符で囲む必要がありますが、JSON文字列全体を単一引用符で囲むことができますvar jsonString = '{"key1":"value1"}';(JSONを手動で作成することをお勧めしません)
nnnnnn

51
できれば、JSONを手動で作成しないでください.stringify()
Camilo Martin

23
これは、ここで常に二重引用符を使用するための最良の議論です。JSONには二重引用符が必要です。他の回答は、ほとんどが「一貫性がある」というアドバイスを与えています。つまり、言語の一部が実際に二重引用符を強制する可能性がある場合は、その二重引用符を一貫して使用する必要があります。
カリブーのジョシュ

18
これは、他のほとんどすべての言語(Java、C、C ++など)が文字列に二重引用符を使用し、文字に単一引用符を使用する複数の言語で作業する場合にも関連します。私は全面的に同じ引用を使用することを好むので、JSには二重引用符を使います。長年のタッチ入力では、二重引用符をシフトするための余分なキーをまったく入力する必要がありません。コーディングが入力によって制約されている場合は、適切に入力を練習する必要があります。
ローレンスドル2014

336

より良い解決策はありません。ただし、二重引用符の方が望ましい場合もあると主張します。

  • 初心者はすでに自分の言語の二重引用符に慣れているでしょう。英語では"、引用されたテキストの一節を識別するために二重引用符を使用する必要があります。単一引用符を使用する'と、読者はそれを短縮形として誤って解釈する可能性があります。で囲まれたテキストのパッセージの他の意味'は、「口語的な」意味を示します。既存の言語と一貫性を保つことは理にかなっており、これによりコードの学習と解釈が容易になる可能性があります。
  • 二重引用符を使用すると、アポストロフィをエスケープする必要がなくなります短縮形など)。文字列:を考慮してください。"I'm going to the mall"それ以外の場合はエスケープされたバージョン:を考慮してください'I\'m going to the mall'
  • 二重引用符は、他の多くの言語の文字列を意味します。JavaやCのような新しい言語を学ぶときは、常に二重引用符が使用されます。Ruby、PHP、Perlでは、単一引用符で囲まれた文字列はバックスラッシュエスケープを意味しませんが、二重引用符はそれらをサポートします。

  • JSON表記は二重引用符で囲みます。

それにもかかわらず、他の人が述べたように、一貫性を保つことが最も重要です。


英語についての最初のポイントは常に正しいとは限らず、地域や家の慣習によって変わる可能性があります。印刷物は通常、スピーチに一重引用符を使用し、引用されたテキストの大きなブロックには他のフォーマットを使用します。あなたの「口語」の意味は、強調のための引用の有用な定義ではありません。さらに、英語のユーザーは一般的に非常に貧しく、引用符とアポストロフィが付いています。
John Ferguson

2
@JohnFergusonは、その理由だけで、(アポストロフィと引用された節の間で)その区別を行うために二重引用符を使用することが望ましい場合があります。
user1429980 2015年

私はすべて実用主義です。私が入力または使用する100の文字列に1つは二重引用符があり、さらに多くの文字がアポストロフィを持っているという事実により、私は二重を使用しています。ただし、結局のところ、1)プロジェクトの新規開発者である場合はプロジェクトで既に使用されている、または2)より理にかなっていると思われる見積タイプを使用する必要があります。
dudewad 2015年

適切な例-私が入力したもの(複数のアポストロフィ、二重引用符はありません;)
dudewad

FWIW -これはQuoraの記事からの引用です:quora.com/...
theUtherSide

118

仕様のセクション7.8.4は、リテラル文字列表記について説明しています。唯一の違いは、DoubleStringCharacterが「SourceCharacterであるが二重引用符ではない」であり、SingleStringCharacterが「SourceCharacterであるが単一引用符ではない」ということです。したがって、唯一の違いはこうして示すことができます:

'A string that\'s single quoted'

"A string that's double quoted"

したがって、エスケープする引用の量によって異なります。明らかに、二重引用符で囲まれた文字列の二重引用符にも同じことが当てはまります。


@Gareth:仕様については話していませんでしたが、パフォーマンスへの影響の可能性について話していました。stackoverflow.com/questions/242813/...
マティアスBynens

コードに十分なアポストロフィを入れて、shift +を押す必要がある回数を補う場合は、間違っています。
SgtPooki 2014

1
何についての"{\"name\": \"Peter\"}"'{"name": "Peter"}'?確かに、これは同じ違いだと言えるかもしれませんが、上記の例とは異なる方法で決定に影響を与えることは確かです。
Trevor

@MathiasBynens-これは、少なくとも1年間、おそらく6年間は関連性のない興味深い観察結果です。
ArtOfWarfare 2015

4
アポストロフィには、垂直方向の単一引用符ではなく、U + 2019を使用する必要があります
jjg

95

単一引用符

二重引用符は標準よりも少しわかりやすいので、それ標準にしたいと思いますが、シーンを支配するので、一重引用符を使い続けています。

単一引用符:

指定なし:

二重引用符:


7
Crockfordは二重引用符を優先します。
Adam Calvet Bohl、2016

6
airbnbは二重引用符を優先するようになりました
Suraj Jain

15
@SurajJainソース?AirbnbGoogleのスタイルガイドでは、シングルが優先されています。
Alec

5
@SurajJainああ、これらはJSONで記述されたコードスタイルチェッカー構成であり、一重引用符をまったく使用できません。それらを読むことは、異なるプロジェクトによって行われた選択を比較する良い方法です。
Alec Mev 2017年

2
Googleは現在、単一引用符を好む
GabrielOshiro

57

その違いは純粋に文体的なものだと言いたいのですが、本当に疑問があります。次の例を考えてみます。

/*
   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、およびInternet Explorer(IE7およびIE8でテスト済み)では、次の結果が返されます。

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

ただし、Firefoxの結果は少し異なります。

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

一重引用符は二重引用符に置き換えられました。(また、インデントスペースが4つのスペースに置き換えられたことにも注意してください。)これにより、少なくとも1つのブラウザーがJavaScriptを内部的に解析し、すべてが二重引用符を使用して記述されているかのように見えます。すべてがこの「標準」に従ってすでに記述されている場合、JavaScriptを解析するためにFirefoxにかかる時間が短くなると考えるかもしれません。

ちなみに、コードでは一重引用符の方がずっと見栄えが良いと思うので、とても悲しいパンダになります。さらに、他のプログラミング言語では、通常、二重引用符よりも高速に使用できるため、同じことがJavaScriptに適用された場合にのみ意味があります。

結論:これについてさらに調査する必要があると思います。

編集:これは、2003年のピーターポールコッホのテスト結果を説明している可能性があります。

Explorer Windowsでは、シングルクォートの方が速い場合あります(私のテストの約1/3は応答時間が速いことを示しています)が、Mozillaがまったく異なる場合は、ダブルクォートをわずかに速く処理します。Operaにはまったく違いがありませんでした。

Edit 2014: Firefox / Spidermonkeyの最新バージョンでは、これはもう行われません。


25
あるブラウザでそれを行う方が少し高速で、別のブラウザで逆に行う方が少し高速である場合、それを取り除くことができる唯一のガイダンスは、いくつかを傷つけるので、私たちはもっと好きなことをするべきだということですユーザーと他の人を助け、違いの量はごくわずかである可能性があります。「時期尚早の最適化...」など。
Andrew Hedges

2
私のコメントがもっと建設的でなかったことを残念に思います。ブラウザが構文の内部表現をどのように表示するかを選択する方法は、構文解析の方法とはほとんど関係がないため、あるタイプの引用符を他のタイプの引用符よりも優先する理由にはなりません。一方、ブラウザ間で一重引用符と二重引用符の解析時間を比較するパフォーマンスデータは、より説得力があります。
Chris Calo、2012年

1
これは素晴らしい答えです。残りの部分から離れて、「彼らは同じで、彼らは同じです」とチャープします... 「さらに、他のプログラミング言語では、通常、ダブルよりも使用が速いです。引用符」、どの言語を尋ねてもいいですか?私はJavaやC#のような通常のlangを使用しましたが、単一引用符で文字列リテラルを受け入れるJS以外は見たことがありません。一重引用符の囲みは、通常、文字定数にのみ使用されます(許可される文字は1つのみ)。
ADTC、2012年

3
私の知る限り、これはFirefox 17で修正されました。Firefoxは実行時に逆コンパイルを行っていました.toStringが、現在は元のコピーを返します。最新のFirefoxにはこの問題はありません。
Benjamin Gruenbaum 2014年

3
速度の違いについては知らない。ただし、「少なくとも1つのブラウザが、すべてが二重引用符を使用して記述されているかのように内部的にJavaScriptを解析するという印象を与える」ことに注意したい。ナンセンスです。二重引用符で書かれているかのように解析されませんでした。つまり、内部表現(引用符ではなく文字列を格納するだけ)を人間が読めるバージョンに変換し、たまたま引用符のセットを使用します。とにかく、ベンジャミンのコメントによると、これは変わったようです。
subsub 2014年

32

インラインJavaScriptを実行している場合(おそらく「悪い」ことですが、その議論は避けてください)、単一引用符が文字列リテラルの唯一のオプションであると私は信じています。

たとえば、これは正常に動作します。

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

しかし、私が知っているエスケープメソッドを使用して、 "hi"を二重引用符で囲むことはできません。&quot;私の推測ではそれでも(HTMLの属性値で引用符をエスケープしているため)、Firefoxでは機能しません。 \"この時点ではJavaScriptではなくHTMLにエスケープしているため、どちらも機能しません。

したがって、ゲームの名前に一貫性があり、アプリの一部でインラインJavaScriptを実行する場合は、一重引用符が適していると思います。私が間違っているのなら誰かが私を訂正してください。


8
間違いなく悪いことであることに同意しましたが、実行する必要がある場合は、URLスタイルのエンコーディングを使用できると確信しています。たとえば<a onclick="alert(%22hi%22);">hi</a>、メモリからこれは機能しますが、href属性にあった可能性があります<a href="javascript:alert(%22hi%22);">hi</a>
Graza

2
@PhiLho正解です...私は人々が従来のように二重引用符で囲まれたHTML属性を書いていて、(1)全体を単一引用符に変換したり、(2)組み合わせて一致させたりしていないと想定していました一重引用符と二重引用符で囲まれた属性。しかし、そうです、あなたは正しいです。合法です
トム・リアンザ'15年

4
@Tom Lianza、確かにalert(&quot;hi&quot;)有効なJavaScriptではありません。ただし、属性の値はエンコードされます。w3.org/TR/html4/intro/sgmltut.html#didx-attribute
ロバート

4
ここで@Robertに同意します。&quot;HTML属性内の二重引用符をエスケープする正しい方法です。Firefoxでは正常に動作します。@ Denilson、XML(したがってXHTML)では、一重引用符と二重引用符の両方を使用できます。w3.org/TR/REC-xml/#d0e888AttValueにあるXML仕様のリテラルを参照してください。
Chris Calo、2012年

1
@Pacener:ええと、それは間違いではありません。HTMLには、二重引用符の間に属性を配置するための規則があります。
Konrad Borowski、2014年

30

技術的には違いはありません、それはスタイルと慣習の問題だけです。

Douglas Crockfordは、内部文字列には一重引用符を使用し、外部には二重引用符を使用することをお勧めします(外部とは、メッセージやアラートなど、アプリケーションのユーザーに表示されるものを意味します)。

私は個人的にそれに従います。

更新:クロックフォード氏は考え変えたようで、今では二重引用符を使用することをお勧めします:)


13
ダグラス・クロックフォードvs JQuery。毒を選びなさい。
エリック

これに対するクロックフォードの理由は何ですか?
BadHorsie 2015

1
これが私の慣習です。より個人的な好みです。私は、jQueryセレクターのような内部的なものやgetElementById( 'id');のようなものに一重引用符で囲まれた文字列を使用するのが好きです。一重引用符でそれが見える方法が好きです。ただし、テキストに内部引用符が含まれることが多いため、外部テキストは二重引用符に切り替えます。また、どちらか一方でエラーを見つけようとする場合に、外部文字列と内部文字列を簡単に見つけて区別することができます。
adimauro

3
2016年4月現在、Douglas Crockford 、実際には多くの開発者が内部と外部の二分法を使用するのが難しいと判断したことから、二重引用符のみを使用すること推奨しています。
Thunderforge

27

厳密に言えば、意味に違いはありません。したがって、選択は利便性に帰着します。

ここにあなたの選択に影響を与える可能性のあるいくつかの要因があります:

  • ハウススタイル:一部の開発者グループは、すでにいずれかの規則を使用しています。
  • クライアント側の要件:文字列内で引用符を使用しますか?(Adyの回答を参照)。
  • サーバー側の言語:VB.Netの人々は、スクリプトをサーバー側で構築できるように、java-scriptに単一引用符を使用することを選択する場合があります(VB.Netは文字列に二重引用符を使用するため、java-script文字列を簡単に区別できます単一引用符を使用する場合)。
  • ライブラリコード:特定のスタイルを使用するライブラリを使用している場合は、同じスタイルを自分で使用することを検討してください。
  • 個人的な好み:1つまたは他のスタイルがよりよく見えると思うかもしれません。

真実ではない、'である00100111一方で、バイナリで"ある00100010バイナリで。したがって、二重引用符は、単一引用符の半分の容量で格納されます。それが違いです。

19

リファレンスが何をするか見てみましょう。

jquery.js内では、すべての文字列が二重引用符で囲まれています。

したがって、今から、二重引用符で囲まれた文字列を使用します。(私はシングルを使用していました!)


11
なぜこれは反対票が投じられたのですか?これはスタイルの問題であり、最良のスタイルは一貫していて、あなたの前に来た人たちに従うことです。
エリック

2
+1 jQuery APIドキュメントも同様です。これが、私が二重引用符を使って解決した唯一の理由でした。個人的には、「個人の好みに帰着する」という答えは少し欠陥があると思います-広く使われている慣習を見つけてそれに固執するのが最善です。また、jQueryから例を(直接または間接に)コピーして貼り付けたい場合があるので、毎回引用符を置き換える必要はありません。
スティーブチェンバーズ

2
おそらく、jQueryはその前の人々を追跡できなかった(または他のほとんどの専門家のように、本当に気にしなかった)。;)
James Wilkins

14

使用するものに一貫性を持たせてください。ただし、快適さを落とさないでください。

"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

ES6アップデート

テンプレートリテラル構文の使用。

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

13

それは主にスタイルと好みの問題です。他の回答には、かなり興味深く有用な技術的な調査があるので、おそらく私が追加できる唯一のものは、少し世俗的なアドバイスを提供することです。

  • 場合あなたが会社やチームでコーディングしている、そしてそれはおそらく「ハウススタイル」に従うことをお勧めします。

  • 場合はあなただけでは、いくつかのサイドプロジェクトをハッキングしている、そしてコミュニティの数著名な指導者を見てください。たとえば、Node.jsにアクセスしたとします。コアモジュール、たとえばunderscore.jsまたはexpressを見て、それらが使用する規則を確認し、それに従うことを検討してください。

  • 場合は、両方の規則が均等に使用され、その後、延期あなたの個人的に
    好み。

  • 場合あなたは何の個人的な好みを持っていない、そして、コインを投げます。

  • あなたがコインを持っていない場合ビールは私にあります;)


13

私は明白なものを追加しないことを望みますが、私はこれに関してDjangoAjaxとJSON と格闘してきました。

HTMLコードで通常どおりに二重引用符を使用すると仮定すると、JavaScriptの残りの部分には単一引用符を使用することを強くお勧めします。

@adyに同意しますが、注意が必要です。

私の結論は、JavaScriptではおそらく問題ではありませんが、HTMLなどに埋め込むとすぐに問題が発生し始めます。文字列を実際にエスケープ、読み取り、渡しているものを知っている必要があります。

私の単純なケースは:

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

showThisの3番目のフィールドで\ 'を見つけることができます。

二重引用符が機能しませんでした!

理由は明らかですが、単一引用符を使用する必要がある理由も明らかです... ..

このケースは非常に単純なHTML埋め込みであり、エラーは「二重引用符で囲まれた」JavaScriptコードからの単純なコピー/貼り付けによって生成されました。

だから質問に答えるために:

HTML内では単一引用符を使用してください。いくつかのデバッグ問題を保存するかもしれません...


1
ES6の文字列補間(バックティック)で同様の問題が発生しました。私のビルドシステムはそれを二重引用符で囲まれた文字列にコンパイルしました。これは、単一引用符で機能していたAuthヘッダーを壊しました!
ジェイ

12

これが今日の世界に関連しているかどうかはわかりませんが、制御文字を処理する必要があるコンテンツには二重引用符を使用し、処理しない文字列には単一引用符を使用していました。

コンパイラーは、二重引用符で囲まれた文字列に対して文字列操作を実行しますが、一重引用符で囲まれた文字列はそのままです。これは、「優れた」開発者が\nまたはなどの制御文字を含まない文字列に一重引用符\0(一重引用符内で処理されない)を使用することを選択することにつながりました。文字列の処理)。


14
以前はある方法で行われていましたが、現在は別の方法で行われているわけではありません。異なる言語は引用を異なる方法で処理し、いくつかはあなたが説明するように機能します。しかし、これはJavaScriptの質問です。一重引用符と二重引用符はJavaScriptでは同じように扱われます(エスケープせずに文字列で他のタイプの引用符を使用できることを除いて)。制御文字または文字列補間を可能にする二重引用符の問題はありません。JavaScriptはそのようには機能しません。制御文字とエスケープシーケンスは、使用する引用符のタイプに関係なく同じように機能します。
Michael Geary 2014年

元Perlプログラマーとして、これは私がJSには無関係であることを知っていますが、私はこれを考え続けています。
zkent 2014

12

jshintを使用している場合使用すると、二重引用符の文字列を使用している場合、それはエラーが発生します。

AngularJSのYeoman scafflholdingを介して使用しましたが、おそらくこれを構成する方法があります。

ちなみに、HTMLをJavaScriptで処理する場合は、単一引用符を使用する方が簡単です。

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

そして、少なくともJSONは、二重引用符を使用して文字列を表します。

あなたの質問に答える簡単な方法はありません


実装jshintは変更されましたか?デモWebサイトは警告/エラーをスローせずにどちらでも受け入れるようで、jshintを使用するように制限するオプションを見つけることができません。おそらく、この回答は時代遅れであるか、不正確ですか?
Lea Hayes

jshintが二重引用符で囲まれた文字列に対してエラーを発生させると、その文字列は深刻に壊れます。JavaScript標準では、壊れたリンターではなく、正しいものを定義しています。
Mecki

10

パフォーマンスについて言えば、見積もりがボトルネックになることは決してありませんが、パフォーマンスはどちらの場合でも同じです。

コーディング速度について言えば'、文字列の区切りに使用する場合は、"引用符をエスケープする必要があります。次の"例のように、文字列内で使用する必要がある可能性が高くなります。

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

次に、'文字列を区切るためにを使用したいので、エスケープする文字を少なくする必要があります。


10

単一引用符を使用する(愚かな)理由の1つは、シフトキーを押して入力する必要がないのに対して、二重引用符を使用するためです。(平均的な文字列はエスケープを必要としないと想定しています。これは妥当な仮定です。)ここで、毎日200行のコードをコーディングするとします。多分それらの200行で私は30の引用符を持っています。おそらく、二重引用符を入力する方が、単一引用符を入力するよりも0.1秒長くかかります(シフトキーを押す必要があるため)。それから、どんな日にでも、私は3秒を無駄にします。この方法でコードを1年に200日間、40年間コーディングすると、6.7時間の無駄になります。思考の糧。


1
ここでは英語のキーボードレイアウトのみを参照していると思います...ドイツ語のレイアウトがあります。両方のシフトを押す必要があります。とにかく、Shiftキーを押すとプロセスに時間がかかる理由がわかりません。左手でシフトを押し、右で引用キーを押します。それは同時に起こります、私にとって違いはありません。
codewandler、2015年

1
@codewandlerあなたが"キーと並行して、それを押すことができても、Shiftキーを押したのコストはまだありそれは離れて、デフォルトの位置から指を移動するためにあなたを強制的にたとえば、あなたにしているタイピングをするとします。var description = "This is a \"quick\" test";上英語キーボード。英語キーボードの場合、小指は、AキーからQキーに移動するのではなく、左のシフトキーから最上列のQキーに移動する必要があります。つまり、2倍の距離を移動する必要があります。 。ドイツ語のキーボードのどこにキーがあるのか​​はわかりませんが、同様の例があると思います
John Kurlak

2
@codewandlerまた、何でもしているタイピングにおける「後に次の文字を入力する準備を左小指を許可していない、私は並行してそれを行うことができた場合でも、シフトを入力すること。
ジョンKurlak

1
「時間の浪費」という考えは少しばかげていますが、人間工学的な負担が少ないという考え(特に心皮トンネル症候群の時代など)は、特に他の点では問題にならない場合に、素晴らしい利益になります。1日あたり1,000行を超えるコードが与えられると、これにより、毎日何百ものピンキーベンドを節約できます。
Beejor

9

長所と短所を調べる

一重引用符を支持して

  • 視覚的な混乱を減らします。
  • HTMLの生成:HTML属性は通常、二重引用符で区切られます。

elem.innerHTML = '<a href="' + url + '">Hello</a>';
ただし、単一引用符はHTMLでも同様に合法です。

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

さらに、インラインHTMLは通常アンチパターンです。テンプレートを優先します。

  • JSONの生成:JSONでは二重引用符のみが許可されています。

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

繰り返しますが、JSONをこの方法で構築する必要はありません。多くの場合、JSON.stringify()で十分です。そうでない場合は、テンプレートを使用します。

二重引用符を支持する

  • カラーコーディングがない場合、ダブルは見つけやすくなります。コンソールログや、ある種のソース表示設定のようなものです。
  • 他の言語との類似性:シェルプログラミング(Bashなど)では、単一引用符で囲まれた文字列リテラルが存在しますが、エスケープはそれらの内部では解釈されません。CおよびJavaは、文字列に二重引用符を使用し、文字に単一引用符を使用します。
  • コードを有効なJSONにする場合は、二重引用符を使用する必要があります。

両方を支持して

JavaScriptの2つの間に違いはありません。そのため、現時点で便利なものは何でも使用できます。たとえば、次の文字列リテラルはすべて同じ文字列を生成します。

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

内部文字列には一重引用符、外部文字列には二重引用符。これにより、ユーザーに表示される(またはディスクに書き込まれる)文字列と内部定数を区別できます。明らかに、後者をコードに含めることは避けなければなりませんが、それが常にできるわけではありません。


8

二重引用符から単一引用符に移行する理由としてもう1つ考慮すべきことは、サーバー側スクリプトの人気の増加です。PHPを使用する場合、PHPで文字列と変数を使用して変数を渡し、JavaScript関数を解析できます。

文字列を記述し、PHPに二重引用符を使用する場合、一重引用符をエスケープする必要はありません。PHPは変数の値を自動的に取得します。

例:サーバーの変数を使用してJavaScript関数を実行する必要があります。

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

これにより、文字列の結合に対処する必要がなくなり、PHPからJavaScriptを効果的に呼び出すことができます。これは1つの例にすぎませんが、これがプログラマーがJavaScriptで単一引用符にデフォルト設定するいくつかの理由の1つである可能性があります。

PHPドキュメントからの引用:「二重引用符で囲まれた文字列の最も重要な機能は、変数名が展開されることです。詳細については、文字列の解析を参照してください。」


+ 1、MVC.Netプロジェクトでこれを行うので、C#からの二重引用符がjavascriptからの単一引用符と干渉しないようになり、その逆も同様です。
DCシャノン2015年

3
PHPクラスのメソッドからページにJavaScriptを書き込んでいる場合、さらに大きな問題があると思います。
BadHorsie

6

パフォーマンスの違いを見ると主張する人がいます:古いメーリングリストのスレッド。しかし、確認できるものが見つかりませんでした。

主なことは、文字列内で使用している引用符(二重または単一)の種類を調べることです。それは脱出の数を低く保つのに役立ちます。たとえば、文字列内でhtmlを使用している場合、一重引用符を使用する方が簡単なので、属性を囲む二重引用符をすべてエスケープする必要はありません。


属性を単一引用符で囲むこともできますが、:)
DamirZekić'28年

あなたの権利、私はxmlとxhtmlが属性を囲む二重引用符を規定していると思いましたが、単一引用符は許可されています。
Michiel Overeem、

6

一重引用符を使用できない場合は二重引用符を使用します(逆も同様)。

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

の代わりに:

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

O'rea "llyのように一重引用符と二重引用符の両方を含む文字列はどうですか
sudhAnsu63

6

JavaScriptでは、一重引用符と二重引用符に違いはありません。

仕様は重要です:

パフォーマンスの違いがあるかもしれませんが、それは絶対に最小限であり、ブラウザの実装に応じて毎日変わる可能性があります。JavaScriptアプリケーションの長さが数十万でない限り、これ以上の議論は無駄です。

それはベンチマークのようなものです

a=b;

より速い

a = b;

(余分なスペース)

今日、特定のブラウザやプラットフォームなどで


2
スペースなしの方が高速です。文字列で解析する文字が少なくなります。:p
pilavdzice

6

CoffeeScriptを使用するときは、二重引用符を使用します。私はあなたがどちらかを選んでそれに固執すべきだということに同意します。CoffeeScriptは、二重引用符を使用するときに補間を提供します。

"This is my #{name}"

ES6はテンプレート文字列にバックティック( `)を使用しています。これにはおそらく正当な理由がありますが、コード化するときに、補間機能を得るために文字列リテラル文字を引用符または二重引用符からバックティックに変更するのは面倒な場合があります。CoffeeScriptは完璧ではないかもしれませんが、どこでも同じ文字列リテラル文字(二重引用符)を使用し、常に補間できるのは素晴らしい機能です。

`This is my ${name}`

私にとって、バックティックはこのコンテストでの勝者であり、一般的なテキスト文字列内には(ほとんど)存在せず、var補間も含まれます
Simone Poggi

5

JavaScriptとC#の間を一気にジャンプする場合は、二重引用符である一般的な慣習に合わせて指をトレーニングするのが最善です。


5

以下を20回ほど走らせています。また、二重引用符の方が約20%速いようです。

楽しい部分は、パート2とパート1を変更すると、単一引用符が約20%速くなることです。

//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
別の言い方をすれば、後のコードが最も速く実行されることがわかりました。これは、マイクロベンチマークを行う際の問題です。実行時にコードを最適化するJSエンジンを考慮する必要があります。(JITがどのように機能するかにより、Javaのベンチマーク時にも同じ効果が見られます。)
David Phillips

4
最初の新しい日付は遅く、var dummy_date = new Date()最初に追加
Lauri

1
ここでのマイクロ最適化のレベルはばかげているので、単一引用符の方が入力が高速であり、開発が高速になると主張することもできます。
Beejor

4

厳密に違いはないので、エスケープの数を低く抑えるには、好みと文字列の内容(またはJSコード自体が文字列の場合)の問題がほとんどです。

速度の違いの伝説は、2つの引用符の動作が異なるPHPの世界に由来する可能性があります。


そして、Rubyを追加します。Pythonの動作はJavaScriptと同じです。一重引用符と二重引用符の間に違いはありません。
DamirZekić08年

4

Googleクロージャーコンパイラが一重引用符を二重引用符に変換するので、それがより高速である、または利点があるかもしれないというすべての回答を読んだ後、二重引用符がより良いまたはおそらくより高速であると思います。


なぜそれができるのか知っていますか?
ma11hew28 2012

知りません。多分それはコーディング規約で特別なものではありません。
Mohsen 2012

4

2020年になりましたので、JavaScriptの3番目のオプション、つまりすべてに対して単一のバックティックを検討する必要があります。

これは、単一引用符または二重引用符の代わりにどこでも使用できます。

それはあなたがすべてのことをすることを可能にします!

  1. その中に一重引用符を埋め込みます:「それは素晴らしいです!」
  2. その中に二重引用符を埋め込みます:「それは「本当に」素晴らしいです!」
  3. 文字列補間を使用します:「すばらしいよりも「$ {better}」です!」
  4. それは複数の行を許可します: `

    この

    作る

    Javascript

    いいね!

    `

また、他の2つを置き換えるときにパフォーマンスが低下することもありません


3

あなたのJSソースが:

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

HTMLソースは次のようになります。

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

またはHTML5の場合

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

JSはそのような配列を許可します:

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

しかし、それを文字列化すると、互換性のある理由になります。

JSON=["this","that"]

これには時間がかかると思います。


3

私の2セントを追加するだけです:数年前にJSとPHPの両方を操作するとき、エスケープ文字( '\')をエスケープすることなく入力できるように、単一引用符を使用することに慣れてきました。私は通常、ファイルパスなどで生の文字列を入力するときに使用しました(http://en.wikipedia.org/wiki/String_literal#Raw_strings

とにかく、私の慣習は、識別子タイプの生の文字列if (typeof s == 'string') ...(エスケープ文字は決して使用されない-ずっと)などの単一引用符、および"Hey、what's up?"などのテキストの二重引用符の使用になりました。識別子名を表示する表記規則として、コメントに一重引用符も使用しています。これは単なる経験則であり、HTML文字列を入力するときなど、必要な場合にのみ中断します'<a href="#"> like so <a>'(ここで引用符を逆にすることもできます)。JSONの場合、名前に二重引用符が使用されていることも知っていますが、それ以外では、個人的には、引用符間のテキストにエスケープが必要ない場合は重引用符を使用しますdocument.createElement('div')

結論として、一部の人が言及/言及したように、慣習を選び、それを守り、必要な場合にのみ逸脱してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.