console.log("double");
vs console.log('single');
文字列を処理するときに一重引用符を使ったJavaScriptライブラリが増えています。一方を他方に使用する理由は何ですか?私はそれらがほとんど交換可能だと思いました。
異なるライブラリでシングルvsダブルを使用する理由として最も可能性が高いのは、プログラマの好みやAPIの一貫性です。
一貫性を保つ以外に、文字列に最も適したものを使用してください。
リテラルとして他の種類の引用を使う:
alert('Say "Hello"');
alert("Say 'Hello'");
…しかし、これは複雑になる可能性があります…
alert("It's \"game\" time.");
alert('It\'s "game" time.');
ES6で新しく追加されたもう1つのオプションは、 テンプレートリテラル です。/は、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を扱っているのであれば、厳密に言えば、JSON文字列は二重引用符で囲む必要があります。確かに、多くのライブラリでも一重引用符がサポートされていますが、文字列の一重引用符が実際にはJSON標準に準拠していないことに気づく前に、私は自分のプロジェクトで大きな問題を抱えていました。
より良い解決策はありません ;しかし、二重引用符の方が望ましい場合があることを主張したいと思います。
"
を使用する必要があります。一重引用符'
を使用する場合、読者はそれを短縮形として誤って解釈する可能性があります。 '
で囲まれたテキストの他の意味は「口語的」な意味を表します。既存の言語と一貫性を保つことは理にかなっています、そしてこれはおそらくコードの学習と解釈を容易にするかもしれません。"I'm going to the mall"
という文字列と、そうでなければエスケープされたバージョン'I\'m going to the mall'
を考えてみましょう。二重引用符は他の多くの言語の文字列を意味します 。 JavaやCのような新しい言語を学ぶときは、二重引用符が常に使われます。 Ruby、PHP、およびPerlでは、一重引用符で囲まれた文字列はバックスラッシュでエスケープされませんが、二重引用符ではサポートされます。
JSON表記は二重引用符で書かれています。
それにもかかわらず、他の人が述べているように、一貫性を保つことが最も重要です。
only の違いは、次のとおりです。
'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(IE 7およびIE 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に適用される場合にのみ意味があります。
結論: これについてもっと研究をする必要があると思います。
編集: これは説明するかもしれません Peter-Paul Kochのテスト結果 2003年の終わりから。
Explorer Windowsでは一重引用符のほうが時々速いようです(私のテストの約1/3が速い応答時間を示しました)が、Mozillaが少しでも違いを示した場合は二重引用符を少し速く処理します。私はOperaに全く違いを見つけませんでした。
2014年編集: Firefox/Spidermonkeyの最近のバージョンでは、これをやりません。
インラインJavaScriptをしている場合(おそらく「悪い」ことではありますが、その議論は避けてください)、 single 引用符は文字列リテラルの唯一の選択肢です。
例えば、これはうまくいきます:
<a onclick="alert('hi');">hi</a>
しかし、私が知っているエスケープ方法では、 "hi"を二重引用符で囲むことはできません。でも "
これは私の最善の推測だったでしょう(HTMLの属性値で引用符をエスケープしているので)、Firefoxではうまくいきません。 \"
現時点ではJavaScriptではなくHTMLを使用しているため、どちらも機能しません。
そのため、ゲームの名前が一貫していて、アプリケーションの一部でインラインJavaScriptを使用するのであれば、一重引用符が勝者になると思います。私が間違っていたら誰かが私を直してください。
技術的には違いはありません。スタイルと規約の問題だけです。
Douglas Crockfordは、内部文字列には一重引用符を使用し、外部文字列には二重引用符を使用することをお勧めします(外部とは、メッセージや警告など、アプリケーションのユーザーに表示されるものです)。
私は個人的にそれに従います。
更新:Mr. Crockford は考えを変えたようです そして今では二重引用符を使うことをお勧めします:)
厳密に言えば、意味に違いはありません。だから選択は利便性に帰着します。
あなたの選択に影響を与える可能性があるいくつかの要因は次のとおりです。
参照が何をするのか見てみましょう。
Jquery.jsでは、すべての文字列が二重引用符で囲まれています。
そこで、今から始めて、二重引用符で囲まれた文字列を使います。 (私はシングルを使用していました!)
それは主にスタイルと好みの問題です。他の答えには、かなりおもしろくて役に立つ技術的な探究がいくつかあります、それで私が加えるかもしれない唯一のものは少し世俗的なアドバイスを提供することです。
If会社やチームでコーディングしている場合は、then「ハウススタイル」に従うことをお勧めします。
Ifあなただけが数人のサイドプロジェクトをハッキングしています、thenコミュニティの何人かの著名なリーダーを見てください。例えばNode.jsに入るとしましょう。 underscore.jsやexpressなどのコアモジュールを見て、それらがどのような規則を使用しているかを確認し、それに従うことを検討してください。
If両方の規約が同じように使われています、thenはあなたの個人的なことに従います
設定.
Ifあなたには個人的な好みはありません、thenコインを弾く。
Ifあなたにはコインがありません、thenビールが私の上にあります;)
明らかなものを追加していないことを願っていますが、これについて 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内では一重引用符を使用してください。それはデバッグ問題のカップルを救うかもしれません….
これが今日の世界に関連があるかどうかはわかりませんが、制御文字を処理する必要があるコンテンツには二重引用符を使用し、そうでないストリングには一重引用符を使用していました。
コンパイラは、二重引用符付き文字列に対して文字列操作を実行し、単一引用符付き文字列はそのまま文字列をそのまま残します。これは、\n
や\0
のような制御文字を含まない文字列(一重引用符内で処理されない)と二重引用符を含む文字列を解析する必要がある場合に使用します。文字列を処理するためのサイクル)。
使用しているものに一貫性を保ってください。しかし、あなたの快適さのレベルを落とさないでください。
"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
jshint を使用している場合、二重引用符を使用するとエラーが発生します。
私はYeularのAngularJSの足場を通してそれを使用しましたが、おそらくこれを設定するための方法があります。
ちなみに、HTMLをJavaScriptに変換するときは、一重引用符を使用するほうが簡単です。
var foo = '<div class="cool-stuff">Cool content</div>';
そして少なくともJSONは二重引用符を使って文字列を表しています。
あなたの質問に答える些細な方法はありません
パフォーマンスに関して言えば、引用符がボトルネックになることは決してありませんが、パフォーマンスはどちらの場合も同じです。
コーディング速度について話しますが、文字列の区切りに'
を使用する場合は、"
引用符をエスケープする必要があります。次の例のように、文字列内で"
を使用する必要があります。
//JSON Objects:
var jsonObject = '{"foo":"bar"}';
//HTML attributes:
document.getElementById("foobar").innerHTML = '<input type="text">';
それから、私は文字列を区切るために'
を使うことを好むので、私はより少ない文字をエスケープしなければなりません。
一重引用符を使用する(愚かな)理由の1つは、二重引用符ではなく、それらを入力するためにシフトキーを押す必要がないことです。 (平均的な文字列はエスケープする必要がないと想定しています。これは合理的な仮定です。)今、毎日200行のコードをコーディングするとしましょう。たぶんそれらの200行に30の引用符があります。二重引用符を入力すると、一重引用符を入力するよりも0.1秒長い時間がかかります(シフトキーを押す必要があるため)。それから任意の日に、私は3秒を無駄にします。私が40年間、1日200日、このようにコーディングした場合、私の人生の6.7時間は無駄になります。思考の糧。
長所と短所を調べる
一重引用符を優先して
elem.innerHTML = '<a href="' + url + '">Hello</a>';
elem.innerHTML = "<a href='" + url + "'>Hello</a>";
さらに、インラインHTMLは通常アンチパターンです。テンプレートを好む。
myJson = '{ "hello world": true }';
繰り返しますが、このようにJSONを構築する必要はありません。 JSON.stringify()で十分なことがよくあります。そうでない場合は、テンプレートを使用してください。
二重引用符を優先して
両方に有利に
JavaScriptでは両者に違いはありません。したがって、現時点では便利なものは何でも使用できます。たとえば、次の文字列リテラルはすべて同じ文字列を生成します。
"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を効果的に呼び出すことができます。これはほんの一例ですが、プログラマがjavascriptで一重引用符をデフォルトにしていない理由はいくつかあります。
PHP documentsからの引用 : "二重引用符で囲まれた文字列の最も重要な特徴は、変数名が展開されるという事実です。詳細は文字列の解析を見てください。"
一重引用符を使用できない場合は二重引用符を使用します。逆の場合も同様です。
"'" + singleQuotedValue + "'"
'"' + doubleQuotedValue + '"'
の代わりに:
'\'' + singleQuotedValue + '\''
"\"" + doubleQuotedValue + "\""
CoffeeScriptを使うときは二重引用符を使います。私はあなたがどちらかを選んでそれに固執するべきであることに同意します。二重引用符を使用すると、CoffeeScriptは補間を行います。
"This is my #{name}"
ES6はテンプレート文字列にバックティック( `)を使用しています。これにはおそらく正当な理由がありますが、コーディングの際には、補間機能を使用するために文字列リテラルの文字を引用符または二重引用符からバックティックに変更するのは面倒です。 CoffeeScriptは完璧ではないかもしれませんが、いたるところに同じ文字列リテラル文字(二重引用符)を使用し、常に補間できるのがいい機能です。
`This is my ${name}`
JavaScriptでは、一重引用符と二重引用符の間に違いはありません。
仕様は重要です。
たぶんパフォーマンスの差異がありますが、それらは絶対に最小限であり、ブラウザの実装に従って毎日変更することができます。 JavaScriptアプリケーションが何十万もの長さでない限り、これ以上の議論は無駄です。
それはベンチマークのようなものです
a=b;
より速いです
a = b;
(余分なスペース)
今日は、特定のブラウザやプラットフォームなどで.
JavaScriptとC#の間を行き来しているのであれば、二重引用符である一般的な慣習のために指を訓練するのが最善です。
パフォーマンスの違いを見ると主張する人がいます: 古いメーリングリストのスレッド 。しかし、私はそれらのどれも確認されることができませんでした。
主なことはあなたがあなたの文字列の中でどのような種類の引用符(二重か単一か)を見ていることです。これは、エスケープ数を少なくするのに役立ちます。たとえば、文字列内で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));
Googleクロージャコンパイラ が一重引用符を二重引用符に変換するため、二重引用符の方が速い、または利点があると回答した場合は、すべての回答を読んでから、二重引用符のほうが優れていると言えます。
ちょうど2セントを追加するために:数年前のJSとPHPの両方で作業する際に、エスケープすることなくエスケープ文字( '\')を入力できるように、単一引用符を使用することに慣れました。それも。通常、ファイルパスなどの生の文字列を入力するときに使用しました( http://en.wikipedia.org/wiki/String_literal#Raw_strings )
とにかく、私の慣例では、if (typeof s == 'string') ...
(エスケープ文字は決して使用されない)などの識別子タイプの生の文字列での単一引用符との二重引用符の使用になりました「ねえ、どうした?」などのテキスト。また、コメント内の単一引用符を、表記規則として識別子名を示すために使用します。これは単なる経験則であり、HTML文字列'<a href="#"> like so <a>'
を入力するときなど、必要なときだけ中断します(ただし、ここで引用符を逆にすることもできます)。 JSONの場合、名前に二重引用符が使用されることも知っていますが、それ以外では、個人的には、エスケープにneverが必要な場合は単一引用符を使用します引用符の間のテキスト-document.createElement('div')
のように。
ボトムライン、およびいくつかの人が言及/暗示したように、規則を選択し、それに固執し、必要な場合にのみ逸脱します。
厳密には違いはないので、エスケープの数を少なくすることは、好みや文字列に含まれるもの(またはJSコード自体が文字列内にある場合)の大部分です。
速度差の凡例はPHP worldに由来する可能性があります。2つの引用符は異なる動作をします。
あなたの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"]
これにはしばらく時間がかかると思います。
一重引用符または二重引用符を使用できます。これにより、たとえば引用符をエスケープする必要なしに、HTML属性内にJavaScriptを簡単にネストすることができます。 PHPでJavaScriptを作成するときも同じです。
一般的な考え方は次のとおりです。可能であれば、エスケープする必要がないような引用符を使用してください。エスケープが少ないほどコードが向上します。
違いは純粋に文体です。私はかつて二重引用符ナチでした。今、私はほとんどすべての場合に一重引用符を使用しています。エディタが構文を強調表示する方法以外に実用的な違いはありません。
ただ問題です 時間 私のために/毎回"
と入力することができるようになる前にshift
キーを押さなければならないたびに私の命を数ミリ秒失う
私は'
を好むのはあなたがそれをする必要がないからです。
それ以外にバックスラッシュ'
で一重引用符で\'
をエスケープすることができます
console.log('Don\'t lose time'); // "Don't lose time"
IEには0個の拡張機能/ツールバーがインストールされているかもしれませんが、firefoxにはいくつかの拡張機能がインストールされているかもしれないことを忘れないでください。これらの拡張はベンチマーク結果に影響を与えます。
ブラウザXはキャンバス要素のレンダリングが速いかもしれませんが、ブラウザXは要素スタイルを取得するのが速いのでそれは本当に重要です。 (だから、なぜブラウザの「製造元」が常に最速のJavaScriptエンジンを持っているのか)
私はほとんどの場合一重引用符を使っています、なぜならphpで開発するとき、一重引用符で囲まれた文字列は決して変更されないからです。私が使うとき
echo "$xyz";
phpでは、$ xyzが評価されますが、これは私が望むものではありません。そのため、Web開発に関しては、常に「代わりに」を使用します。したがって、php/jscriptに関しては少なくとも文字列の一貫性を確保する必要があります。
残念ながら、これはJavaやObjective Cではできません。 ''はcharを表し、 ""はstringを表します。しかし、これはまた別の問題です。
私の場合、VIMエディタでコーディングし、何かが一重引用符で囲まれている場合は、ダブルクリックして二重引用符内のテキストのみを選択できます。一方、二重引用符には、簡単なコピーと貼り付けをしたいときに気になる引用符が含まれています。
例えば。 'myVar'をダブルクリックVIMエディタのコピー数:> myVar <"myVar"が文字通りコピーされます:> "myVar" <を貼り付けるときは、両側の引用符を削除する必要があります。
とにかく私の2セント...
あなたがJavaScriptコードを生成するためにphpを使うならば、あなたは次の宣言を使うべきです。
let value = "<?php echo 'This is my message, "double quoted" - \'single quoted\' ?>";
出力は次のようになります。
This is my message, "double quoted" - 'single quoted'
いくつかの理由から、PHPでは二重引用符ではなく一重引用符を使用することをお勧めします。 Javascriptの通常の動作には、一重引用符を使用することをお勧めします。
var value = 'This is my message';
document.getElementById('sample-text').innerHTML = value;
<span id="sample-text"></span>
あなたは二重引用符で崇高なテキストとvscodeでこのコードを実行することはできません:
<a href="javascript:alert(“Hello World!”);">Execute JavaScript</a>
このコードは動作します:
<a href="javascript:alert('Hello World!');">Execute JavaScript</a>
これはすべて利便性/好みの問題だと思います。
二重引用符は、C#が持っているものと、私が普段使っている私の環境に一致するので、二重引用符を使用します。C#+ JS。
また、一重引用符の上に二重引用符がある理由として、これがあります(私のプロジェクトのコードで見たことがあります)。サーバー側(私はこれが悪い習慣であることを知っています)、そして一重引用符が誤ってレンダリングされるでしょう。
通常の言語で二重引用符を使用する可能性は低いため、何かを壊さないようにするほうが良い可能性があると思います。
個人的には、読みやすくするために単一引用符を好みます。終日コードを見つめていると、二重引用符ではなく単一引用符だけで単語が見やすくなります。
ここに示すように読みやすくします:
'読みやすい'
「読みにくい」
「「読みにくい」」