我应该在JavaScript中何时使用双引号或单引号?

我应该在JavaScript中何时使用双引号或单引号?,javascript,string,conventions,Javascript,String,Conventions,console.log(“双”)vs.console.log('single') 我看到越来越多的JavaScript库在处理字符串时使用单引号。使用其中一个的原因是什么 我认为它们几乎可以互换。在不同的库中使用single和double最可能的原因是程序员的偏好和/或API的一致性。除了保持一致,使用最适合字符串的 使用其他类型的引号作为文字: alert('Say "Hello"'); alert("Say 'Hello'"); 这可能会变得复杂:

console.log(“双”)vs.console.log('single')

我看到越来越多的JavaScript库在处理字符串时使用单引号。使用其中一个的原因是什么


我认为它们几乎可以互换。

在不同的库中使用single和double最可能的原因是程序员的偏好和/或API的一致性。除了保持一致,使用最适合字符串的

使用其他类型的引号作为文字:

alert('Say "Hello"');
alert("Say 'Hello'");
这可能会变得复杂:

alert("It's \"game\" time.");
alert('It\'s "game" time.');
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`);
模板文本为以下内容提供了干净的语法:变量插值、多行字符串等


请注意,正式指定使用双引号,这可能值得考虑,具体取决于系统要求。

有人声称看到性能差异:。但是我找不到任何一个可以确认的


主要的事情是查看您在字符串中使用了什么类型的引号(双引号或单引号)。这有助于减少逃逸人数。例如,当您处理字符串中的HTML内容时,使用单引号更容易,这样您就不必转义属性周围的所有双引号。

严格来说没有区别,因此主要是口味和字符串中的内容(或者如果JavaScript代码本身在字符串中),保持低逃逸次数


speed difference图例可能来自PHP world,在PHP world中,两个引号具有不同的行为。

严格来说,没有意义上的差异;因此,选择归根结底是为了方便

以下是可能影响您选择的几个因素:

  • 房屋风格:一些开发商已经使用了这样或那样的惯例
  • 客户端要求:您会在字符串中使用引号吗?(见附件。)
  • 服务器端语言:VB.NET用户可能会选择对JavaScript使用单引号,以便在服务器端构建脚本(VB.NET对字符串使用双引号,因此如果使用单引号,JavaScript字符串很容易区分)
  • 图书馆代码:如果您使用的是使用特定样式的库,您可能会考虑自己使用相同的样式。
  • 个人喜好:你可能认为其中一种或另一种风格看起来更好
第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(在和中测试)中,将返回以下内容:

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, "");
}
单引号已被双引号取代。(还要注意缩进空间是如何被四个空格替换的。)这给人的印象是,至少有一个浏览器在内部解析JavaScript,就像所有内容都是使用双引号编写的一样。有人可能会认为,如果所有内容都已经按照这个“标准”编写,那么Firefox解析JavaScript所需的时间就更少了

顺便说一句,这让我很难过,因为我认为单引号在代码中看起来更好。另外,在其他编程语言中,它们的使用速度通常比双引号快,因此只有将双引号应用于JavaScript时才有意义

结论:我认为我们需要对此做更多的研究

这或许可以从2003年开始解释

在资源管理器窗口中,单引号有时似乎更快(我的测试中大约有1/3的测试显示响应时间更快),但如果Mozilla显示出任何差异,它处理双引号的速度会稍微快一些。我发现歌剧没有什么不同


2014:现代版本的Firefox/Spidermonkey不再这样做了。

如果你在使用内联JavaScript(可以说是一件“坏”事情,但避免了这种讨论)我相信单引号是字符串文本的唯一选择

例如,这很好用:

<a onclick="alert('hi');">hi</a>
hi
但是你不能通过我知道的任何转义方法将“hi”用双引号括起来。在Firefox中,
即使是我最好的猜测(因为你在转义HTML属性值中的引号),也不适用于我。
也不适用,因为此时你转义的是HTML,而不是JavaScript


因此,如果游戏的名称是一致性,并且您要在应用程序的某些部分中使用内联JavaScript,我认为单引号是赢家。如果我错了,请有人纠正我。

如果不能使用单引号,我会使用双引号,反之亦然:

"'" + singleQuotedValue + "'"
'"' + doubleQuotedValue + '"'
而不是:

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

JavaScript中单引号和双引号之间没有任何区别

规范很重要:

可能存在性能差异,但它们是绝对最小的,可以根据浏览器的实现随时改变。除非JavaScript应用程序有几十万行长,否则进一步的讨论是徒劳的

这就像一个基准,如果

a=b;
快于

a = b;
(额外空间)


今天,在一个特定的浏览器和平台上,等等。

我已经运行了大约20次以下内容。而且双引号的速度似乎要快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));
有趣的是,如果你改变第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));
//第1部分
var r='';
var iTime3=新日期().valueOf();
对于(var j=0;
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>'
// JSON Objects:
var jsonObject = '{"foo":"bar"}';

// HTML attributes:
document.getElementById("foobar").innerHTML = '<input type="text">';
var foo = '<div class="cool-stuff">Cool content</div>';
elem.innerHTML="<img src='smily' alt='It\'s a Smily' style='width:50px'>";
<img src="smiley" alt="It's a Smiley" style="width:50px">
<img src=smiley alt="It's a Smiley" style=width:50px>
var arr=['this','that'];
JSON=["this","that"]
"This is my #{name}"
`This is my ${name}`
"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