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


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

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


1688


起源


哪个更容易阅读?警报(“这是游戏时间”);或警告('它的游戏时间'); - Ryan Miller
这个瑞恩怎么样? alert("It's \"game\" time."); 要么 alert('It\'s "game" time.');? - Francisc
如果单引号总是使用,偶尔双引号,其中文字包含单引号,那么我们将不得不输入更少的移位按钮,我们的左手小指将给我们祝福。但是,正如@arne所说,应该使用JSON双引号。 - IsmailS
当你在欧洲键盘上时,单引号更容易做到(双引号是Shift + 2,这不如通过你的右小指方便地点击单个键那么甜)。 - Arne
@Arne没有“欧洲键盘”这样的东西。例如。该 德国键盘 需要转换两种类型的报价。 (但单引号更容易。) - ANeves


答案:


在不同库中使用单一与双重的最可能原因是程序员偏好和/或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(`The escape the \` back-tick character in a string`);

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


1044



所有代码约定都需要注意的重要事项 - 定义一次并坚持下去。 IOW,不要在某处使用双引号,在其他地方使用单引号。 - Cerebrus
@Cerebrus - 我觉得这个灵活性还算可以。当然选择一个首选的样式,但如果您需要脱离样式以保存在一个字符串中转义大量引号。我会好的。 - Martin Clarke
@Mathias Bynens:你无法证明某事的不存在。证明那里 是 任何一个都有优势,这就是要走的路。 ;) - Pascal
jsfiddle.net/5HhWF/1 我发现速度没有区别(铬) - Olly Hicks
@Pascal我觉得他在开玩笑。这很有趣。 - ACK_stoverflow


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


569



当使用jQuery.ajax调用ASP.NET服务(Web服务,页面方法或MVC)时,这非常相关。 - Schmuli
属性名称 中 JSON字符串必须是双引号,但JSON字符串作为一个整体可以单引号: var jsonString = '{"key1":"value1"}'; (不是我建议手动构建JSON。) - nnnnnn
如果可以的话,你不应该手工编写JSON .stringify() 它。 - Camilo Martin
这里这是始终使用双引号的最佳参数。 JSON应该有双引号。其他答案主要是提供“一致”的建议,这意味着如果语言的任何一部分可能实际强制双引号,则应始终使用该双引号。 - Josh from Qaribou
这在使用多种语言时也很重要,几乎所有其他语言(Java,C,C ++,...)都使用字符串的双引号和字符的单引号。我更喜欢全面使用相同的引用,因此坚持使用JS的双引号。通过多年的触摸输入,双引号转换的额外键完全无关紧要,如果您的编码受到键入的限制,那么您需要练习正确的键入。 - Lawrence Dol


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

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

  • JSON表示法用双引号编写。

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


244



关于英语的第一点并不总是正确的,可以根据地方/房屋惯例而改变。印刷材料通常使用单引号进行语音处理,并对大块引用文本使用其他格式。你的“口语”含义并不是强调引用的有用定义。加上英语用户一般都很差,引号和撇号。 - John Ferguson
@JohnFerguson,仅仅因为这个原因,可能需要使用双引号来进行区分(在撇号和引用的段落之间)。 - user1429980
我以前一直偏爱单引号,这可能只是说服我在下一个项目中使用双引号...谢谢 - A5308Y
我讲的是实用主义。由于我输入或使用的100个字符串中的1个具有双引号,并且许多,更多有撇号,我使用双精度。但是,在一天结束时,如果您是项目的新开发人员,则应该使用已经在项目中使用的报价类型,或者2)使用您认为更有意义的报价类型。 - dudewad
例证 - 我刚输入的内容(有多个撇号,没有双引号;) - dudewad


只要 差异如下所示:

'A string that\'s single quoted'

"A string that's double quoted"

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


112



你怎么能确定这是唯一的区别? - Mathias Bynens
加雷斯提出了一个很好的观点。我没想到这个 - anonymous coward
@Mathias - 规范7.8.4节[ecma-international.org/publications/standards/Ecma-262.htm] 描述文字字符串表示法,唯一的区别是DoubleStringCharacter是“SourceCharacter但不是双引号”而SingleStringCharacter是“SourceCharacter但不是单引号” - Gareth
@Mathias - 好的,我明白了你的观点,虽然我很乐意认为JavaScript程序已被优化到可以产生可测量差异的程度(即便如此,这仍然是特定解释器的突发奇想),我对此,我只是有点愤世嫉俗。 - Gareth
关于什么 "{\"name\": \"Peter\"}" VS '{"name": "Peter"}'?不可否认,你可以说这是相同的差异,但它肯定会以不同于上述例子的方式影响你的决定。 - Trevor


单引号

我希望双引号是标准,因为它们 更有意义,但我一直使用单引号,因为它们占据了整个场景。

单引号:

没有偏好:

双引号:


68



克罗克福德现在优先考虑双引号。 - Adam Calvet Bohl
谷歌现在优先考虑双引号 - Suraj Jain
airbnb现在优先采用双引号 - Suraj Jain
@SurajJain来源? 制作的Airbnb 和 谷歌 样式指南仍然列出单个首选。 - Olegs Jeremejevs
@SurajJain啊,这些是用JSON编写的代码样式检查器配置,它根本不允许单引号。阅读它们是比较不同项目所做选择的好方法。 - Olegs Jeremejevs


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

/*
   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年回来。

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

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


54



如果在一个浏览器中以一种方式稍微快一点,而在另一个浏览器中稍微快一点,那么另一种方式就是这样做,我们可以从中获取的唯一指导就是我们应该做任何我们喜欢的事情因为它会伤害一些用户和帮助他人,差异的可能性是不可察觉的。 “过早优化......”等等。 - Andrew Hedges
对不起,我的评论不太具有建设性。我只是说浏览器选择如何显示其语法的内部表示可能与解析它的方式没什么关系,因此可能不是一种理由更喜欢一种类型的引号而不是另一种。另一方面,比较浏览器中单引号和双引号的分析时间的性能数据将更具吸引力。 - Chris Calo
这是一个很棒的答案,与其他人休息只是唧唧喳喳'他们是一样的'他们是一样的'......你说 “另外,在其他编程语言中,它们的使用速度通常比双引号更快”,请问哪种语言?我使用过像Java和C#这样的常规语言,从来没有见过JS以外用单引号接受字符串文字。单引号封装通常仅用于字符常量(仅允许一个char)。 - ADTC
AFAIK这是在Firefox 17中修复的,Firefox用来做反编译 .toString 但现在它返回原始副本。现代firefox不会有这个问题。 - Benjamin Gruenbaum
不知道速度差异。但我想指出“这给人的印象是,至少有一个浏览器在内部解析JavaScript,好像所有内容都是用双引号编写的。”是胡说八道。它看起来像是用双引号写的。也就是说,它将其内部表示(仅存储字符串,而不是引号)转换为人类可读的版本,为此恰好使用一组引号。无论如何,根据本杰明的评论,这似乎已经改变了。 - subsub


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

例如,这工作正常:

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

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

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


30



同意可以说是坏事,但如果必须这样做,我很确定可以使用URL样式编码,例如 <a onclick="alert(%22hi%22);">hi</a>  - 从内存中可行,但它可能已经在href属性中 <a href="javascript:alert(%22hi%22);">hi</a> - Graza
<a onclick='alert("hi");'>hi</a> 合法也是...... - PhiLho
<a onclick="alert(&quot;hi&quot;)"> 适合我.. - Robert
@Tom Lianza,当然 alert(&quot;hi&quot;) 是无效的JavaScript。但是属性的值被编码。 w3.org/TR/html4/intro/sgmltut.html#didx-attribute - Robert
同意@Robert在这里。 &quot; 是在HTML属性中转义双引号的正确方法。它在Firefox中运行良好。 @Denilson,XML(以及XHTML)允许单引号和双引号。见 AttValue XML规范中的字面值 w3.org/TR/REC-xml/#d0e888。 - Chris Calo


从技术上讲,没有什么区别,这只是风格和惯例的问题。

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

我亲自跟着这个。

更新:看来克罗克福德先生 改变他的想法 现在建议在整个过程中使用双引号:)


29



Douglas Crockford对阵JQuery。选择你的毒药。 - Eric
克罗克福德的理由是什么? - BadHorsie
这是我遵循的惯例。这是个人偏好。我喜欢使用单引号字符串作为jQuery选择器之类的内部函数,和/或像getElementById('id')这样的东西;我只是喜欢它用单引号看起来的样子。但是,切换到外部文本的双引号,因为它通常可以在文本中包含内部引号。此外,如果您试图在一个或另一个中找到错误,它可以很容易地发现和区分外部字符串和内部字符串。 - adimauro
截至2016年4月,Douglas Crockford 现在推荐 仅使用双引号,因为在实践中,许多开发人员发现内部与外部二分法难以使用。 - Thunderforge
感谢@Thunderforge的更新 - Mariusz Nowak


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

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

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

24



不对, ' 是 00100111 在二进制,而 " 是 00100010 在二进制。因此,双引号占用单引号存储的功率的一半。那就是那里的差异。


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

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

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


18



为什么这会被投票。这是一个风格问题,最好的风格是保持一致,并跟随那些来到你面前的人。 - Eric
+1 jQuery API文档 也是。这是我选择双引号的唯一原因。就个人而言,我认为“归结为个人偏好”的答案有点瑕疵 - 最好找出一个广泛使用的惯例并坚持下去。因为我可能想要从jQuery(直接或间接)复制和粘贴示例,所以我不想每次都替换引号。 - Steve Chambers
也许jQuery未能跟随他们之前的人(或者像大多数其他专家一样真的不关心)。 ;) - James Wilkins
但是Angular ....(开个玩笑:P) - Jin Wang
如果严重的话,大声笑不起来 - Spets