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

问题描述 投票:1830回答:41

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

在处理字符串时,我看到越来越多的JavaScript库使用单引号。使用其中一个的原因是什么?我以为它们几乎可以互换。

javascript string conventions
41个回答
1157
投票

在不同库中使用单一与双重的最可能原因是程序员偏好和/或API一致性。

除了一致之外,使用最适合字符串的:

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

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

......但这会变得复杂......

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

另一个选项,ES6中的新选项,是使用Template literals字符的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`);

模板文字为以下内容提供了清晰的语法:变量插值,多行字符串等。


17
投票

让我们看一下参考文献的作用。

在jquery.js中,每个字符串都是双引号。

所以,从现在开始,我将使用双引号字符串。 (我用的是单身!)


14
投票

这主要是风格和偏好的问题。在其他答案中有一些相当有趣和有用的技术探索,所以也许我唯一可能添加的是提供一些世俗的建议。

  • 如果你是在公司或团队中编码,那么遵循“家庭风格”可能是一个好主意。
  • 如果你独自攻击一些辅助项目,那么请看一下社区中的一些杰出领导者。比如让我们说你进入了Node.js.看看核心模块,例如underscore.js或表达他们使用的约定,并考虑遵循这一点。
  • 如果两种惯例同等使用,则按照您的个人惯例 偏爱。
  • 如果您没有个人喜好,那就掷硬币。
  • 如果你没有硬币,那么啤酒就在我身上;)

13
投票

我希望我没有添加明显的东西,但我一直在与DjangoAjax以及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的第三个字段中找到\'。

双引号不起作用!

很明显为什么,但也很明显为什么我们应该坚持单引号......我猜...

这种情况是一个非常简单的HTML嵌入,错误是通过“双引号”JavaScript代码中的简单复制/粘贴生成的。

所以回答这个问题:

尝试在HTML中使用单引号。它可能会节省一些调试问题......


13
投票

只需保持您使用的一致性。但是不要失望你的舒适程度。

"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

12
投票

不确定这在当今世界是否相关,但是双引号曾用于需要处理控制字符的内容,而单引号则用于没有处理控制字符的字符串。

编译器将对双引号字符串运行字符串操作,同时保留单引号字符串字面上不变。这曾经导致'好'的开发人员选择对不包含\n\0等控制字符的字符串使用单引号(不在单引号内处理)和双引号时需要解析字符串(在cpu中略有成本)处理字符串的循环)。


12
投票

如果您使用的是jshint,如果您使用双引号字符串,则会引发错误。

我通过AngomanJS的Yeoman脚手架使用它,但也许有某种方式来配置它。

顺便说一下,当你将HTML处理成JavaScript时,使用单引号更容易:

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

至少JSON使用双引号来表示字符串。

没有简单的方法来回答你的问题


10
投票

谈到性能,引用永远不会成为你的瓶颈,但是,两种情况下的性能都是相同的。

谈论编码速度,如果你使用'来分隔字符串,你将需要转义"引号。在示例中,您更可能需要在字符串中使用"

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

然后,我更喜欢使用'来分隔字符串,所以我必须逃避更少的字符。


9
投票

使用单引号的一个(愚蠢)理由是它们不需要您按Shift键来键入它们,而双引号则需要。 (我假设平均字符串不需要转义,这是一个合理的假设。)现在,让我们假设我每天编写200行代码。也许在这200行中我有30个引号。也许输入双引号比输入单引号花费0.1秒(因为我必须按下shift键)。然后在任何一天,我浪费3秒。如果我以这种方式编码,每年200天,40年,那么我浪费了6.7小时的生命。值得深思。


9
投票

检查利弊

赞成单引号

  • 减少视觉混乱。
  • 生成HTML:HTML属性通常用双引号分隔。

elem.innerHTML = '<a href="' + url + '">Hello</a>';
However, single quotes are just as legal in HTML.

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

此外,内联HTML通常是反模式。喜欢模板。

  • 生成JSON:JSON中只允许使用双引号。

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

同样,您不必以这种方式构造JSON。 JSON.stringify()通常就足够了。如果没有,请使用模板。

赞成双引号

  • 如果您没有颜色编码,则更容易发现双打。就像在控制台日志或某种视图源设置中一样。
  • 与其他语言的相似之处:在shell编程(Bash等)中,存在单引号字符串文字,但不会在其中解释转义。 C和Java对字符串使用双引号,对字符使用单引号。
  • 如果您希望代码是有效的JSON,则需要使用双引号。

赞成两者

JavaScript中的两者没有区别。因此,您可以使用目前方便的任何方式。例如,以下字符串文字都生成相同的字符串:

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

内部字符串的单引号和外部的双引号。这允许您区分内部常量和要显示给用户的字符串(或写入磁盘等)。显然,你应该避免将后者放在代码中,但这并不总是可以做到的。


8
投票

您可能需要考虑的另一件事是从双引号转换为单引号的原因是服务器端脚本的流行度增加。使用PHP时,您可以使用PHP中的字符串和变量传递变量并解析javascript函数。

如果您编写一个字符串并为PHP使用双引号,则不必转义任何单引号,PHP将自动为您检索变量的值。

示例:我需要使用服务器中的变量运行javascript函数。

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

这为我不得不处理加入字符串带来了很多麻烦,我可以有效地从PHP调用javascript。这只是一个例子,但这可能是程序员在javascript中默认使用单引号的几个原因之一。

Quote from PHP documents:“双引号字符串最重要的特性是变量名称将被扩展。请参阅字符串解析以获取详细信息。”


601
投票

如果您正在处理JSON,应该注意严格来说,JSON字符串必须是双引号。当然,许多库也支持单引号,但在我意识到单个引用字符串实际上不符合JSON标准之前,我在其中一个项目中遇到了很大问题。


6
投票

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

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

代替:

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

6
投票

JavaScript中的单引号和双引号没有区别。

规格很重要:

也许存在性能差异,但它们绝对是最小的,并且可以根据浏览器的实现每天更改。除非您的JavaScript应用程序长达数十万,否则进一步的讨论是徒劳的。

这就像是一个基准

a=b;

比...更快

a = b;

(额外空间)

今天,在特定的浏览器和平台等


6
投票

使用CoffeeScript时,我使用双引号。我同意你应该选择任何一个并坚持下去。 CoffeeScript在使用双引号时为您提供插值。

"This is my #{name}"

ES6正在使用返回刻度(`)作为模板字符串。这可能有一个很好的理由,但是在编码时,将字符串文字字符从引号或双引号更改为返回标记以获得插值功能可能很麻烦。 CoffeeScript可能不完美,但在任何地方使用相同的字符串文字字符(双引号)并始终能够插值是一个很好的功能。

`This is my ${name}`

5
投票

有些人声称会看到性能差异:old mailing list thread。但我找不到任何一个被证实。

主要是看你在字符串中使用什么样的引号(双或单)。它有助于保持低逃逸的数量。例如,当您在字符串中使用html时,使用单引号更容易,这样您就不必转义属性周围的所有双引号。


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

4
投票

在阅读了所有可能更快或可能有优势的答案之后,我会说双引号更好或者更快也因为Google closure compiler将单引号转换为双引号。


3
投票

完全没有区别,所以它主要是品味和字符串中的内容(或者如果JS代码本身是字符串),以保持低逃逸数。

速度差异图例可能来自PHP世界,其中两个引号具有不同的行为。


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') ...(其中永远不会使用转义字符),以及文本的双引号,例如“嘿,什么事情?” 。我还在注释中使用单引号作为显示标识符名称的印刷约定。这只是一个经验法则,我只在需要时中断,例如在键入HTML字符串'<a href="#"> like so <a>'时(虽然你也可以在这里反转引号)。我也知道,在JSON的情况下,双引号用于名称 - 但在个人之外,我更喜欢单引号,当引号之间的文本从不需要转义时 - 如document.createElement('div')

底线,正如一些人提到/提到的那样,选择一个约定,坚持下去,并且只在必要时偏离。


306
投票

没有更好的解决方案;但是,我想有时候双引号可能更令人满意:

  • 新手已经熟悉他们语言的双引号。在英语中,我们必须使用双引号"来识别引用文本的段落。如果我们使用单引号',读者可能会将其误解为收缩。由'包围的文本段落的另一个含义表示“口语”含义。与预先存在的语言保持一致是有意义的,这可能会简化代码的学习和解释。
  • 双引号消除了逃避撇号的需要(如在收缩中)。考虑字符串:"I'm going to the mall",与其他转义版本:'I\'m going to the mall'
  • 双引号表示许多其他语言中的字符串。当您学习Java或C等新语言时,始终使用双引号。在Ruby,PHP和Perl中,单引号字符串表示没有反斜杠转义,而双引号支持它们。
  • JSON表示法用双引号编写。

尽管如此,正如其他人所说,保持一致是最重要的。


3
投票

您可以使用单引号或双引号。这使您可以轻松地将JavaScript嵌套在HTML属性中,而无需转义引号。当你用PHP创建javascript时也是如此。

一般的想法是:如果有可能使用这样的引号,你不需要逃避。减少逃避=更好的代码。


116
投票

唯一的区别在于以下内容:

'A string that\'s single quoted'

"A string that's double quoted"

所以,这只取决于您想要做多少报价。显然,同样适用于双引号字符串中的双引号。


83
投票

Single Quotes

我希望双引号是标准,因为他们make a little bit more sense,但我继续使用单引号,因为他们主宰现场。

单引号:

没有偏好:

双引号:


56
投票

我想说的不同之处纯粹是风格,但我真的很怀疑。请考虑以下示例:

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

单引号已被双引号替换。 (还要注意缩进空间是如何被四个空格替换的。)这给人的印象是至少有一个浏览器在内部解析JavaScript,好像所有内容都是用双引号编写的。有人可能会认为,如果所有内容都已根据此“标准”编写,则需要花费较少的时间来解析JavaScript。

顺便说一下,这让我成为一只非常悲伤的熊猫,因为我认为单引号在代码中看起来更好。另外,在其他编程语言中,它们通常比双引号更快使用,因此只有在应用于JavaScript时才有意义。

结论:我认为我们需要对此进行更多研究。

编辑:这可能解释了2003年的Peter-Paul Koch's test results

在资源管理器Windows中,单引号似乎有时更快(大约1/3的测试确实显示出更快的响应时间),但如果Mozilla完全显示出差异,则它会稍快处理双引号。我发现Opera没有任何区别。

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


31
投票

如果您正在使用内联JavaScript(可以说是一个“坏”的东西,但避免讨论)单引号是字符串文字的唯一选择,我相信。

例如,这工作正常:

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

但是你不能通过我所知道的任何转义方法将“hi”包装在双引号中。甚至&quot;本来是我最好的猜测(因为你在HTML的属性值中转义引号)在Firefox中对我不起作用。 \"也不会工作,因为此时你正在逃避HTML,而不是JavaScript。

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


29
投票

从技术上讲,没有区别,只有风格和惯例才有问题。

Douglas Crockford建议对内部字符串使用单引号,对外部使用双引号(外部我们指的是向应用程序用户显示的那些,如消息或警报)。

我亲自关注。

更新:似乎Crockford先生changed his mind,现在建议使用双引号:)


26
投票

严格来说,意义上没有区别;所以选择归结为方便。

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

  • 房屋风格:一些开发商团体已经使用一种或多种惯例。
  • 客户端要求:您是否在字符串中使用引号? (见Ady的回答)。
  • 服务器端语言:VB.Net人们可能会选择对java脚本使用单引号,以便脚本可以在服务器端构建(VB.Net对字符串使用双引号,因此java脚本字符串很容易区分如果他们使用单引号)。
  • 库代码:如果您使用的是使用特定样式的库,您可以考虑自己使用相同的样式。
  • 个人偏好:您可能认为一种或其他风格看起来更好。
© www.soinside.com 2019 - 2024. All rights reserved.