console.log("double");
対。console.log('single');
文字列を処理するときに一重引用符を使用する JavaScript ライブラリがますます増えています。どちらか一方を使用する理由は何ですか?
かなり交換可能だと思いました。
console.log("double");
対。console.log('single');
文字列を処理するときに一重引用符を使用する JavaScript ライブラリがますます増えています。どちらか一方を使用する理由は何ですか?
かなり交換可能だと思いました。
異なるライブラリで single と double を使用する最も可能性の高い理由は、プログラマの好みや API の一貫性です。一貫性があること以外は、文字列に最も適したものを使用してください。
他のタイプの引用符をリテラルとして使用する:
alert('Say "Hello"');
alert("Say 'Hello'");
これは複雑になる可能性があります。
alert("It's \"game\" time.");
alert('It\'s "game" time.');
もう 1 つのオプションは、ECMAScript 6 で新しく追加されたもので、バッククォート文字を使用するテンプレート リテラルです。
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は二重引用符を使用するように正式に指定されていることに注意してください。これは、システム要件によっては検討する価値がある場合があります。
JSON を扱っている場合、厳密に言えば、JSON 文字列は二重引用符で囲む必要があることに注意してください。確かに、多くのライブラリも一重引用符をサポートしていますが、文字列の一重引用符が実際には JSON 標準に従っていないことに気付く前に、プロジェクトの 1 つで大きな問題が発生しました。
これ以上の解決策はありません。ただし、二重引用符の方が望ましい場合があると主張したいと思います。
"
、引用されたテキストのパッセージを識別するために二重引用符を使用する必要があります。一重引用符を使用する'
と、読者はそれを短縮形と誤解する可能性があります。で囲まれたテキストの一節の他の意味は'
、「口語的な」意味を示します。既存の言語と一貫性を保つことは理にかなっています。これにより、コードの学習と解釈が容易になる可能性があります。"I'm going to the mall"
とそれ以外の場合はエスケープされたバージョン:を考えてみましょう'I\'m going to the mall'
。他の多くの言語では、二重引用符は文字列を意味します。Java や C などの新しい言語を学ぶときは、常に二重引用符が使用されます。Ruby、PHP、および Perl では、単一引用符で囲まれた文字列はバックスラッシュ エスケープがないことを意味しますが、二重引用符はそれらをサポートします。
JSON 表記は二重引用符で記述されます。
それにもかかわらず、他の人が述べたように、一貫性を保つことが最も重要です。
仕様のセクション 7.8.4 では、リテラル文字列表記について説明しています。唯一の違いは、DoubleStringCharacter は「SourceCharacter ですが二重引用符ではありません」であり、SingleStringCharacter は「SourceCharacter ですが単一引用符ではありません」ということです。したがって、唯一の違いは次のように実証できます。
'A string that\'s single quoted'
"A string that's double quoted"
したがって、どの程度の引用エスケープを行いたいかによって異なります。明らかに、二重引用符で囲まれた文字列の二重引用符にも同じことが当てはまります。
違いは純粋にスタイル上のものだと言いたいのですが、私は本当に疑問を持っています. 次の例を検討してください。
/*
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 ( Internet Explorer 7およびInternet Explorer 8でテスト済み) では、次のように返されます。
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 を内部的に解析するように見えます。すべてがこの「標準」に従って既に書かれている場合、Firefox が JavaScript を解析するのにかかる時間が短いと考える人もいるかもしれません。
ところで、コードでは一重引用符の方が見栄えが良いと思うので、これは私を非常に悲しいパンダにします。さらに、他のプログラミング言語では通常、二重引用符よりも高速に使用できるため、同じことが JavaScript に適用された場合にのみ意味があります。
結論:これについてはもっと研究する必要があると思います。
これは、2003 年にさかのぼるPeter-Paul Koch のテスト結果を説明するかもしれません。
Explorer Windows では一重引用符の方が高速な場合があるようです (私のテストの約 1/3 で応答時間が短縮されました)。Operaではまったく違いが見つかりませんでした。
2014: Firefox/Spidermonkey の最新バージョンでは、これが行われなくなりました。
インライン JavaScript を実行している場合 (おそらく "悪い" ことですが、その議論は避けます)、単一引用符が文字列リテラルの唯一のオプションだと思います。
たとえば、これはうまくいきます:
<a onclick="alert('hi');">hi</a>
しかし、私が知っているエスケープ方法を使用して、「こんにちは」を二重引用符で囲むことはできません。(HTML の属性値で引用符をエスケープしているため) どちらが私の最善の推測であったとしても"
、Firefox では機能しません。 "
この時点では、JavaScript ではなく HTML をエスケープしているため、どちらも機能しません。
したがって、ゲームの名前が一貫性であり、アプリケーションの一部でインライン JavaScript を実行する場合は、一重引用符が勝者だと思います。私が間違っている場合は、誰かが私を修正してください。
技術的には違いはありません。それはスタイルと慣習の問題だけです。
Douglas Crockfordは、内部文字列には一重引用符を使用し、外部文字列には二重引用符を使用することを推奨しています (外部とは、メッセージやアラートなど、アプリケーションのユーザーに表示される文字列を意味します)。
私は個人的にそれに従います。
更新: クロックフォード氏は気が変わったようで、全体で二重引用符を使用することをお勧めします:)
厳密に言えば、意味に違いはありません。したがって、選択は利便性に帰着します。
選択に影響を与える可能性のあるいくつかの要因は次のとおりです。
参照が何をするか見てみましょう。
jquery.js内では、すべての文字列が二重引用符で囲まれています。
したがって、ここからは、二重引用符で囲まれた文字列を使用します。(私はシングルを使用していました!)
使用するものに一貫性を保つだけです。ただし、快適さのレベルを下げないでください。
"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
ECMAScript 6 の更新
テンプレート リテラル構文の使用。
`Be "my" guest. You're in complete freedom.`; // Most comfort :D
明らかなことを追加していないことを願っていますが、これについてDjango、Ajax、および JSON に苦労しています。
通常のように HTML コードで二重引用符を使用すると仮定すると、JavaScript の残りの部分には単一引用符を使用することを強くお勧めします。
したがって、私は adyに同意しますが、注意が必要です。
私の結論は次のとおりです。
JavaScript では問題にならないかもしれませんが、HTML などに埋め込むとすぐに問題が発生し始めます。文字列を実際にエスケープ、読み取り、渡しているものを知っておく必要があります。
私の単純なケースは次のとおりです。
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>'
showThis の 3 番目のフィールドで ' を見つけることができます。
二重引用符が機能しませんでした。
理由は明らかですが、一重引用符に固執する必要がある理由も明らかです...私は推測します...
このケースは非常に単純な HTML 埋め込みであり、「二重引用符で囲まれた」JavaScript コードからの単純なコピー/貼り付けによってエラーが生成されました。
質問に答えるには:
HTML 内では一重引用符を使用するようにしてください。いくつかのデバッグの問題を解決できるかもしれません...
それは主にスタイルと好みの問題です。他の回答には、かなり興味深く有用な技術的調査がいくつかあるため、おそらく私が追加できる唯一のことは、少し世俗的なアドバイスを提供することです.
会社やチームでコーディングしている場合は、「ハウス スタイル」に従うことをお勧めします。
いくつかのサイド プロジェクトを 1 人でハッキングしている場合は、コミュニティの著名なリーダーを見てみましょう。たとえば、 Node.jsに入るとしましょう。Underscore.jsや Express などのコア モジュールを見て、それらが使用する規則を確認し、それに従うことを検討してください。
両方の規則が等しく使用されている場合は、個人的な好みに従ってください。
個人的な好みがない場合は、コインを投げてください。
あなたがコインを持っていないなら、ビールは私にあります;)
これが今日の世界に関係があるかどうかはわかりませんが、制御文字を処理する必要があるコンテンツには二重引用符が使用され、処理されない文字列には単一引用符が使用されていました。
コンパイラは、二重引用符で囲まれた文字列に対して文字列操作を実行しますが、一重引用符で囲まれた文字列はそのまま残します。\n
これにより、「優れた」開発者は、またはのような制御文字を含まない文字列には一重引用符を使用し\0
(一重引用符内で処理されない)、文字列を解析する必要がある場合は二重引用符を使用することを選択していました (CPU サイクルでわずかなコストがかかります)。文字列を処理します)。
JSHintを使用している場合、二重引用符で囲まれた文字列を使用するとエラーが発生します。
私は AngularJS の Yeoman scafflholding を通じて使用しましたが、これを構成する何らかの方法があるかもしれません。
ところで、HTML を JavaScript で処理する場合は、一重引用符を使用する方が簡単です。
var foo = '<div class="cool-stuff">Cool content</div>';
そして、少なくとも JSON は文字列を表すために二重引用符を使用しています。
あなたの質問に答える簡単な方法はありません。
JavaScript では、一重引用符と二重引用符に違いはありません。
仕様は重要です。
パフォーマンスの違いがあるかもしれませんが、それらは絶対に最小限であり、ブラウザーの実装に応じていつでも変更できます。JavaScript アプリケーションが数十万行の長さでない限り、これ以上の議論は無駄です。
ならベンチマークみたいなもん
a=b;
よりも速い
a = b;
(余分なスペース)
今日、特定のブラウザやプラットフォームなどで
One (silly) reason to use single quotes would be that they don't require you to hit the shift key to type them, whereas a double quote do. (I'm assuming that the average string doesn't require escaping, which is a reasonable assumption.) Now, let's suppose every day I code 200 lines of code. Maybe in those 200 lines I have 30 quotes. Maybe typing a double quote takes 0.1 seconds more time than typing a single quote (because I have to hit the shift key). Then on any given day, I waste 3 seconds. If I code in this manner for 200 days a year for 40 years, then I've wasted 6.7 hours of my life. Food for thought.
長所と短所を調べる
一重引用符を支持して
elem.innerHTML = '<a href="' + url + '">Hello</a>';
elem.innerHTML = "<a href='" + url + "'>Hello</a>";
さらに、インライン HTML は通常、アンチパターンです。テンプレートを優先します。
myJson = '{ "hello world": true }';
繰り返しますが、この方法で JSON を構築する必要はありません。多くの場合、JSON.stringify() で十分です。そうでない場合は、テンプレートを使用してください。
二重引用符を支持して
両方に賛成
JavaScript では、この 2 つに違いはありません。したがって、現時点で便利なものは何でも使用できます。たとえば、次の文字列リテラルはすべて同じ文字列を生成します。
"He said: \"Let's go!\""
'He said: "Let\'s go!"'
"He said: \"Let\'s go!\""
'He said: \"Let\'s go!\"'
内部文字列は一重引用符、外部文字列は二重引用符。これにより、内部定数と、ユーザーに表示される (またはディスクなどに書き込まれる) 文字列を区別できます。明らかに、後者をコードに入れることは避けるべきですが、常にできるとは限りません。
二重引用符から単一引用符への移行の理由として考慮すべきもう 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 つかもしれません。
二重引用符で囲まれた文字列の最も重要な機能は、変数名が展開されるという事実です。詳細については、文字列の解析を参照してください。
CoffeeScriptを使用するときは、二重引用符を使用します。どちらかを選択して、それに固執する必要があることに同意します。二重引用符を使用すると、CoffeeScript によって補間が行われます。
"This is my #{name}"
ECMAScript 6は、テンプレート文字列にバックティック (`) を使用しています。これにはおそらく正当な理由がありますが、コーディング時に、補間機能を得るために文字列リテラルの文字を引用符または二重引用符からバッククォートに変更するのは面倒な場合があります。CoffeeScript は完璧ではないかもしれませんが、どこでも同じ文字列リテラル文字 (二重引用符) を使用し、常に補間できることは優れた機能です。
`This is my ${name}`
パフォーマンスの違いが見られると主張する人がいます:古いメーリング リスト スレッド。しかし、確認できるものは見つかりませんでした。
主なことは、文字列内で使用している引用符 (二重または単一) の種類を確認することです。エスケープの数を低く抑えるのに役立ちます。たとえば、文字列内の HTML コンテンツを操作する場合、属性を囲むすべての二重引用符をエスケープする必要がないように、単一引用符を使用する方が簡単です。
以下を約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));
一重引用符を使用できない場合は二重引用符を使用し、その逆も同様です。
"'" + singleQuotedValue + "'"
'"' + doubleQuotedValue + '"'
それ以外の:
'\'' + singleQuotedValue + '\''
"\"" + doubleQuotedValue + "\""
より高速である、または利点がある可能性があるというすべての回答を読んだ後、Google Closure コンパイラは単一引用符を二重引用符に変換するため、二重引用符の方が優れているか、またはより高速である可能性があります。
厳密には違いはないので、ほとんどの場合、文字列の内容 (または JavaScript コード自体が文字列内にある場合) は好みの問題であり、エスケープの数を低く抑える必要があります。
速度の違いの凡例は、2 つの引用符の動作が異なる PHP の世界に由来する可能性があります。
JavaScript ソースが
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>
JavaScript では、次のような配列を使用できます。
var arr=['this','that'];
ただし、文字列化すると、互換性の理由になります。
JSON=["this","that"]
これには時間がかかると確信しています。
私にとってはちょうど問題の時間です。Shift入力できるようになる前にキーを押さなければならないたびに、数ミリ秒が失われ"
ます。
'
あなたがそれをする必要がないという理由だけで私は好きです!
それ以外は、'
バックスラッシュを使用して単一引用符内をエスケープできます\'
。
console.log('Don\'t lose time'); // "Don't lose time"
違いは純粋にスタイルです。私はかつて二重引用符のナチスでした。現在、ほぼすべてのケースで一重引用符を使用しています。エディターが構文を強調表示する方法以外に実質的な違いはありません。
私の場合、Vimエディターでコードを記述し、何かが一重引用符で囲まれている場合、ダブルクリックして引用符内のテキストのみを選択できます。一方、二重引用符には引用符が含まれており、簡単にコピーして貼り付けたいときに面倒です。
たとえば、Vim エディターで 'myVar' をダブルクリックすると、次のようにコピーされます: >myVar< "myVar" は、文字通り次のようにコピーされます: >"myVar"< 貼り付けるときは、両側の引用符を削除する必要があります。
PHP で開発する場合、一重引用符で囲まれた文字列はまったく変更されないため、私はほとんどの場合一重引用符を使用します。私が使うとき
echo "$xyz";
PHP では $xyz が評価されますが、これは私が望んでいるものではありません。したがって、Web 開発に関しては常に'
代わりに使用します。"
そのため、PHP/JavaScript に関しては、少なくとも文字列の一貫性を確保します。
残念ながら、これは Java またはObjective-Cでは実行できません。ここで、''
は文字を""
表し、文字列を表します。しかし、これは別の問題です。
Internet Explorerには拡張機能/ツールバーがインストールされていない可能性がありますが、Firefoxにはいくつかの拡張機能がインストールされている可能性があることを忘れないでください(たとえば、Firebugについて考えています)。これらの拡張機能は、ベンチマーク結果に影響を与えます。
ブラウザXは要素スタイルの取得が高速であるのに対し、ブラウザYはキャンバス要素のレンダリングが高速である可能性があるため、それほど重要ではありません(したがって、ブラウザの「製造元」は常に最速のJavaScriptエンジンを備えています)。
これはすべて利便性/好みの問題だと思います。
二重引用符は C# と一致するため、私は二重引用符を好みます。これは、私が普段作業している環境 (C# + JavaScript) です。
また、単一引用符を二重引用符で囲む理由の 1 つとして、これが考えられます (これは私のプロジェクト コードで見つけました)。サーバー側(これは悪い習慣だと私は知っています)、一重引用符は間違ってレンダリングされます。
通常の言語でダブル クォーテーションを使用する確率は低いため、何かを壊さない可能性が高いと思います。
他の回答で述べられているように、それらはほとんど同じです。しかし、私はもっと追加しようとします。
"
の前に(#34)を最初に表示する'
ため、データ構造に応じてCPUサイクルを数回節約できます。"
アンチXSSエンジンによってエスケープされますさまざまな言語で JavaScript コードを使用する場合、一重引用符を使用すると、一貫してコードの調整が少なくて済むことがわかりました。
二重引用符は、複数行の文字列をサポートします。
ベスト プラクティスは、最初に二重引用符 ("") を使用し、必要に応じて後に単一引用符 ('') を使用することです。その理由は、サーバー側のスクリプトを使用する場合、二重引用符ではなく単一引用符を使用すると、サーバーからコンテンツを取得できないためです (データベースからの SQL クエリの例)。