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

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

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

我以为它们是可以互换的。

707185 次浏览

在不同的库中使用单对双的最可能的原因是程序员的偏好和/或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`);

模板文字提供了一个干净的语法:变量插值、多行字符串等。

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

有些人声称看到了性能差异:旧邮件列表线程。但我找不到任何可以确认的。

最重要的是查看你在字符串中使用了什么样的引号(双引号还是单引号)。这有助于保持较低的转义次数。例如,当你在字符串中使用超文本标记语言内容时,使用单引号更容易,这样你就不必转义属性周围的所有双引号。

严格来说没有区别,所以主要是品味和字符串中的内容(或者如果JavaScript代码本身在字符串中)的问题,以保持较低的转义次数。

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

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

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

  • 房屋风格:一些开发人员团体已经使用了一种约定或另一种约定。
  • 客户端需求:您会在字符串中使用引号吗?(参见阿迪的回答。)
  • 服务器端语言: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 prototype2. By creating a 'stand-alone' functionThis is just to demonstrate results are the same in both cases.*/
// Extend the String prototype with a trim() methodString.prototype.trim = function() {return this.replace(/^\s+|\s+$/g, '');};
// 'Stand-alone' trim() functionfunction trim(str) {return str.replace(/^\s+|\s+$/g, '');};
document.writeln(String.prototype.trim);document.writeln(trim);

在Safari,Chrome,Opera和Internet Explorer(在Internet Explorer 7Internet Explorer 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, "");}

单引号已被双引号替换。(还要注意缩进空间是如何被四个空格替换的。)这给人的印象是,至少有一个浏览器在内部解析JavaScript,就好像所有内容都是使用双引号编写的一样。有人可能会想,如果一切都已经按照这个“标准”编写,那么Firefox解析JavaScript的时间就会更少。

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

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

这可能解释了2003年的Peter Paul Koch的测试结果

似乎单引号在资源管理器Windows中快了有时(大约1/3的测试确实显示了更快的响应时间),但如果Mozilla显示出任何差异,它处理双引号的速度略快。

2014年:火狐/蜘蛛猴的现代版本不再这样做了。

我认为重要的是不要忘记,虽然Internet Explorer可能安装了零扩展/工具栏,但Firefox可能安装了一些扩展(例如我只是在考虑Firebug)。这些扩展将对基准测试结果产生影响。

这并不重要,因为浏览器X在获取元素样式方面更快,而浏览器Y在渲染画布元素方面可能更快(因此浏览器“制造商”总是拥有最快的JavaScript引擎)。

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

例如,这工作得很好:

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

但是你不能用双引号包装“hi”,通过我所知道的任何转义方法。即使是#0,这是我最好的猜测(因为你在超文本标记语言的属性值中转义引号)在Firefox中对我也不起作用。

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

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

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

而不是:

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

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

规格很重要:

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

这就像一个基准如果

a=b;

a = b;

(额外空间)

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

我已经运行了大约20次。双引号似乎快了大约20%。

有趣的是,如果你改变第2部分和第1部分,单引号大约快20%。

//Part1var 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 2var 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));

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

在阅读了所有说它可能更快或可能有优势的答案后,我想说双引号更好或可能更快,因为谷歌闭包编译器将单引号转换为双引号。

您可能需要考虑的另一个原因是从双引号转向单引号的原因是服务器端脚本的普及。使用PHP时,您可以使用PHP中的字符串和变量传递变量并解析JavaScript函数。

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

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

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

这节省了我处理连接字符串的很多麻烦,并且我可以有效地从PHP调用JavaScript。这只是一个例子,但这可能是程序员默认使用JavaScript单引号的几个原因之一。

引用PHP文档

双引号字符串最重要的特性是变量名将被扩展。有关详细信息,请参阅字符串解析。

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

道格拉斯·克罗克福德建议内部字符串使用单引号,外部字符串使用双引号(外部是指显示给应用程序用户的字符串,如消息或警报)。

我个人遵循这一点。

更新:看起来Crockford先生改变了主意,现在建议在整个过程中使用双引号:)

对于跨不同语言使用JavaScript代码,我发现单引号始终需要较少的代码调整。

双引号支持多行字符串。

我希望我没有添加一些显而易见的东西,但我一直在努力使用DjangoAjax和JSON。

假设在你的超文本标记语言代码中使用双引号,我强烈建议在JavaScript中使用单引号。

所以我同意与ady,但要小心。

我的底线是:

在JavaScript中,这可能无关紧要,但是一旦你把它嵌入到超文本标记语言或类似语言中,你就会开始遇到麻烦。你应该知道什么是实际的转义、读取、传递你的字符串。

我的简单案例是:

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>'

你可以在show this的第三个字段中找到'。

双引号不起作用!

原因很清楚,但也很清楚为什么我们应该坚持单引号……我猜……

这个案例是一个非常简单的超文本标记语言嵌入,错误是由“双引号”JavaScript代码的简单复制/粘贴生成的。

来回答这个问题:

尝试在超文本标记语言中使用单引号。它可能会节省一些调试问题…

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

  • 如果你在一个公司或团队中编码,然后遵循“房子风格”可能是个好主意。

  • 如果你独自完成了一些辅助项目,然后看看社区中一些杰出的领导者。例如,假设你进入了Node.js。看看核心模块,例如,Underscore.js或Express,看看他们使用了什么约定,并考虑遵循它。

  • 如果这两个约定同样使用,然后遵从您的个人偏好。

  • 如果你没有任何个人偏好,然后抛硬币。

  • 如果你没有硬币,然后啤酒算我的;)

让我们看看引用是做什么的。

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

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

对我来说,如果我在Vim编辑器中编码,如果某些内容包含在单引号中,我可以双击以选择只有引号中的文本。另一方面,双引号包含引号,当我想做一些快速复制和粘贴时,我觉得很烦人。

例如。'myVar'在Vim编辑器副本中双击:>myVar<“myVar”逐字复制:>“myVar”<当我粘贴时,我必须删除两边的引号。

正如其他答复所述,它们几乎相同。但我会尝试补充更多。

  1. 一些有效的算法使用字符数组来处理字符串。这些算法(浏览器编译器等)会在'(#39)之前首先看到"(#34),因此根据您的数据结构节省了几个CPU周期。
  2. "被反XSS引擎转义

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

编译器将在双引号字符串上运行字符串操作,而不影响单引号字符串。这通常会导致“优秀”开发人员选择对不包含控制字符(如\n\0)的字符串使用单引号(未在单引号中处理),并在需要解析字符串时使用双引号(处理字符串的CPU周期略有损失)。

如果你在JavaScript和C#之间来回跳跃,最好训练你的手指来适应双引号的常见惯例。

没有比这更好的解决办法了;然而,我想说双引号有时可能更可取:

  • 3、在英语中,我们必须使用双引号"来识别一段被引用的文字。如果我们使用单引号',读者可能会把它误解为缩略语。被'包围的一段文字的另一种含义表明了口语的含义。与现有语言保持一致是有意义的,这可能会缓解代码的学习和解释。
  • 双引号消除了转义撇号的需要(如缩写)。考虑字符串:"I'm going to the mall",与否则转义的版本:'I\'m going to the mall'
  • 双引号在许多其他语言中都表示字符串。当你学习Java或C等新语言时,总是使用双引号。在Ruby、PHP和Perl中,单引号字符串不表示反斜杠转义,而双引号支持它们。

  • JSON表示法是用双引号写的。

然而,正如其他人所说,最重要的是保持一致。

最好的做法是先使用双引号(""),如果需要的话,在后面使用单引号("")。原因是如果您使用服务器端脚本,如果您使用单引号而不是双引号,您将无法从服务器提取内容(例如SQL数据库中的查询)。

我认为这完全是一个方便/偏好的问题。

我更喜欢双引号,因为它与C#相匹配,这是我通常工作的环境:C#+JavaScript。

双引号超过单引号的另一个可能原因是(我在项目代码中找到了):法语或其他一些语言经常使用单引号(实际上是英语),所以如果出于某种原因,你最终从服务器端渲染字符串(我知道这是不好的做法),那么单引号将错误地渲染。

在常规语言中使用双引号的概率很低,因此我认为它更有可能不破坏某些东西。

谈到性能,报价永远不会成为您的瓶颈。然而,在这两种情况下,性能是相同的。

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

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

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

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

如果您使用的是JSHint,如果您使用双引号字符串,它将引发错误。

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

顺便说一句,当您将超文本标记语言处理为JavaScript时,使用单引号更容易:

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

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

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

如果您的JavaScript源代码是

elem.innerHTML="<img src='smily' alt='It\'s a Smily' style='width:50px'>";

超文本标记语言源将是:

<img src="smiley" alt="It's a Smiley" style="width:50px">

或者对于HTML5

<img src=smiley alt="It's a Smiley" style=width:50px>

JavaScript允许这样的数组:

var arr=['this','that'];

但是如果你把它串起来,这将是出于兼容性的原因:

JSON=["this","that"]

我肯定这需要一些时间。

添加我的两分钱:几年前,在使用JavaScript和PHP时,我已经习惯了使用单引号,这样我就可以输入转义字符(")而无需转义它。我通常在使用文件路径等输入原始字符串时使用它。

无论如何,我的惯例最终变成了在标识符类型的原始字符串上使用单引号,例如if (typeof s == 'string') ...(其中永远不会使用转义字符),以及文本的双引号,例如“嘿,怎么了?”。我还在注释中使用单引号作为排版惯例来显示标识符名称。这只是一个经验法则,我只在需要时中断,例如在键入超标记文本语言字符串'<a href="#"> like so <a>'时(尽管您也可以在此处反转引号)。我也知道,在JSON的情况下,双引号用于名称-但除此之外,我个人更喜欢单引号,当转义时,引号之间的文本需要从未-如document.createElement('div')

底线是,正如一些人提到/暗示的那样,选择一个惯例,坚持下去,只在必要时偏离。

您可以使用单引号或双引号。

例如,这使您能够轻松地将JavaScript内容嵌套在超文本标记语言属性中,而无需转义引号。当您使用PHP创建JavaScript时也是如此。

一般的想法是:如果可能的话,使用这样的引号,你不需要转义。

更少的转义=更好的代码。

当使用脚本编写时,我使用双引号。我同意您应该选择其中一个并坚持使用。CoffeeScript在使用双引号时为您提供插值。

"This is my #{name}"

ECMAScript 6是对模板字符串使用反引号(')。这可能有一个很好的理由,但是在编码时,将字符串文本字符从引号或双引号更改为反引号以获得插值功能可能很麻烦。CoffeeScript可能不完美,但在任何地方使用相同的字符串文本字符(双引号)并且始终能够插值是一个不错的功能。

`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

ECMAScript 6更新

使用模板文字语法

`Be "my" guest. You're in complete freedom.`; // Most comfort :D

检查利弊

赞成单引号

  • 更少的视觉混乱。
  • 生成超文本标记语言:超文本标记语言属性通常由双引号分隔。

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

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

此外,内联超文本标记语言通常是一种反模式。

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

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

Again, you shouldn’t have to construct JSON this way. JSON.stringify() is often enough. If not, use templates.

In favor of double quotes

  • Doubles are easier to spot if you don't have color coding. Like in a console log or some kind of view-source setup.
  • Similarity to other languages: In shell programming (Bash etc.), single-quoted string literals exist, but escapes are not interpreted inside them. C and Java use double quotes for strings and single quotes for characters.
  • If you want code to be valid JSON, you need to use double quotes.

In favor of both

There is no difference between the two in JavaScript. Therefore, you can use whatever is convenient at the moment. For example, the following string literals all produce the same string:

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

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

对我来说,这只是第一件事。每次我必须按下Shift键,然后才能输入",我的生命就损失了几毫秒。

我更喜欢',因为你不必这样做!

除此之外,您可以在带有反斜杠\'的单引号内转义'

console.log('Don\'t lose time'); // "Don't lose time"

我大部分时间都使用单引号,因为在PHP中开发时,单引号字符串不会改变,这就是我想要的。当我使用

echo "$xyz";

在PHP中,$xyz被评估,这是我想要的没有。因此,当涉及到Web开发时,我总是使用'而不是"。因此,当涉及到PHP/JavaScript时,我至少确保字符串一致性。

不幸的是,这不能在Java或Objective-c中完成,其中''代表字符,""代表字符串。但这是另一个问题。

如果您使用PHP生成JavaScript代码,您应该使用以下声明。

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>

就我个人而言,为了易读性,我更喜欢单引号。如果我整天盯着代码,那么更容易看到只有单引号的单词,而不是双引号。

更容易阅读,如下所示:

“易于阅读”

“难以阅读”

"最难读"

现在已经是2020年了,我们应该考虑JavaScript的第三个选择:一切的单一反向标记。

这可以在任何地方使用,而不是单引号或双引号。

它允许你做所有的事情!

  1. 在其中嵌入单引号:太棒了!

  2. 在其中嵌入双引号:'真的很棒!'

  3. 使用字符串插值:'这是'${更好}'比伟大!'

  4. 它允许多行:

    这个

    使

    javascript

    好多了!

'

替换其他两个时也不会造成任何性能损失:反引号(")比JavaScript中的其他字符串慢吗?

我更喜欢使用单引号'。它更容易打字,看起来更好。

另外,我们要记住,直接引号(单引号和双引号)在良好的排版中是错误的。花引号更可取,所以我宁愿使用正确的字符而不是转义直接引号。

const message = 'That\'s a \'magic\' shoe.' // This is wrongconst message = 'That’s a ‘magic’ shoe.' // This is correct

https://practicaltypography.com/straight-and-curly-quotes.html

有人可以向Visual Studio Code添加智能引用功能吗?

此外,规范(目前在MDN中提到)似乎没有说明单引号和双引号之间的任何区别,除了结束和一些未转义的少数字符。然而,模板文字(')假设额外的解析/处理。

字符串字面值是0个或多个用单引号或双引号括起来的Unicode代码点。Unicode代码点也可以用转义序列表示。所有代码点都可以按字面意思出现在字符串文字中,除了结束引号代码点U+005C (REVERSE SOLIDUS)U+000D (CARRIAGE RETURN)U+000A (LINE FEED)。任何代码点都可以以转义序列的形式出现。字符串字面值计算为ECMAScript字符串值…

来源:https://tc39.es/ecma262/#sec-literals-string-literals

单引号(')使用一个键盘键,而双引号使用两个键(转变+')。所以节省按键按下次数也是一个优势!(:

这个答案几乎毫无用处,但我的一般准则是使用双引号来表示字符串何时对用户可见,而单引号则用于将其专门传递给函数。然而,Jshint w109建议单引号字符串,但这主要是我的个人偏好