什么时候在 JavaScript 中使用双引号或单引号?

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

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

答案

在不同的库中使用单一或双重的最可能原因是程序员的喜好和 / 或 API 一致性。除了保持一致之外,请使用最适合该字符串的那个。

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

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

这可能会变得复杂:

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

ES6 中的另一个新选项是使用back-tick字符的Template 文字

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 标准。

没有一个更好的解决方案 ; 但是,我想指出有时双引号可能更可取:

  • 新人已经熟悉他们语言中的双引号 。在英语中,我们必须用双引号" ,以确定引用文本的通道。如果我们使用单引号'读者可能会误解它作为收缩。文本段落的其他含义包围的'指示 “口语” 的含义:与先前存在的语言保持一致是有意义的,这可能会简化代码的学习和解释。
  • 双引号消除了转义撇号的需要 (如在收缩中)。考虑一下字符串: "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(在 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,就好像所有内容都是使用双引号编写的一样。 有人可能会认为,如果一切都已经按照 “标准” 编写,那么 Firefox 解析 JavaScript 的时间就会更少。

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

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

编辑:这也许可以解释Peter-Paul Koch在 2003 年的测试结果

似乎在 Explorer Windows 中有时单引号有时会更快(大约有 1/3 的测试确实显示了更快的响应时间),但是如果 Mozilla 完全不同,则处理双引号的速度会稍快。我发现 Opera 中没有任何区别。

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

我相信,如果您正在执行内联 JavaScript(可以说是 “坏” 事情,但避免了讨论),则引号是字符串文字的唯一选择。

例如,这很好用:

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

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

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

从技术上讲,没有区别,只是样式和约定。

Douglas Crockford 建议对内部字符串使用单引号,对外部字符串使用双引号(“外部” 是指要显示给应用程序用户的信息,例如消息或警报)。

我个人遵循。

更新:似乎克罗克福德先生改变了主意 ,现在建议在整个过程中使用双引号:)

严格来说,意义没有区别。因此选择取决于方便。

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

  • 房屋风格:一些开发人员组已经使用一种约定或另一种约定。
  • 客户端要求:您将在字符串中使用引号吗? (请参阅 Ady 的答案)。
  • 服务器端语言:VB.Net 人们可能选择对 Java 脚本使用单引号,以便可以在服务器端构建脚本(VB.Net 对字符串使用双引号,因此易于区分 Java 脚本字符串(如果使用单引号)。
  • 库代码:如果使用的库使用特定样式,则可以考虑自己使用相同的样式。
  • 个人喜好:您可能会认为一种或其他样式看起来更好。

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

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

因此,从现在开始,我将使用双引号引起来的字符串。 (我正在使用单身!)