console.log("double");
对比console.log('single');
我看到越来越多的 JavaScript 库在处理字符串时使用单引号。使用其中一种的原因是什么?
我认为它们几乎可以互换。
console.log("double");
对比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`);
模板文字为变量插值、多行字符串等提供了简洁的语法。
请注意,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(在Internet Explorer 7和Internet 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 时才有意义。
结论:我认为我们需要对此做更多的研究。
这或许可以解释Peter-Paul Koch早在 2003 年的测试结果。
似乎在资源管理器 Windows中单引号有时更快(我的测试中大约 1/3 确实显示出更快的响应时间),但如果 Mozilla 完全显示出差异,它处理双引号的速度会稍微快一些。我发现 Opera 完全没有区别。
2014:现代版本的 Firefox/Spidermonkey 不再这样做了。
如果你正在做内联 JavaScript(可以说是一个“坏”的事情,但避免讨论)单引号是字符串文字的唯一选择,我相信。
例如,这很好用:
<a onclick="alert('hi');">hi</a>
但是您不能通过我知道的任何转义方法将“hi”用双引号引起来。即使"
这是我最好的猜测(因为你在 HTML 的属性值中转义引号)在 Firefox 中对我不起作用。 "
也不起作用,因为此时您正在转义 HTML,而不是 JavaScript。
因此,如果游戏的名称是一致性,并且您将在应用程序的某些部分中执行一些内联 JavaScript,我认为单引号是赢家。如果我错了,请有人纠正我。
从技术上讲没有区别。这只是风格和惯例的问题。
Douglas Crockford建议对内部字符串使用单引号,对外部字符串使用双引号(外部是指要显示给应用程序用户的字符串,例如消息或警报)。
我个人遵循这一点。
更新:克罗克福德先生似乎改变了主意,现在建议在整个过程中使用双引号:)
严格来说,意思上没有区别;所以选择归结为方便。
以下是可能影响您选择的几个因素:
让我们看看引用的作用。
在 jquery.js 中,每个字符串都是双引号。
所以,从现在开始,我将使用双引号字符串。(我用的是单人!)
只要保持你使用的一致性。但不要降低你的舒适度。
"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
我希望我没有添加一些明显的东西,但我一直在努力使用Django、Ajax和 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 中使用单引号。它可能会节省一些调试问题......
这主要是风格和偏好的问题。其他答案中有一些相当有趣和有用的技术探索,所以我可能唯一要补充的就是提供一些世俗的建议。
如果您在公司或团队中编码,那么遵循“house style”可能是一个好主意。
如果你一个人在做一些业余项目,那么看看社区中的一些杰出领导者。例如,假设您进入Node.js。看看核心模块,例如Underscore.js或 express,看看它们使用什么约定,并考虑遵循它。
如果两种约定均等使用,则遵从您的个人喜好。
如果您没有任何个人喜好,请掷硬币。
如果你没有硬币,那么啤酒就在我身上;)
我不确定这在当今世界是否相关,但双引号过去用于需要处理控制字符的内容,而单引号用于不需要处理的字符串。
编译器将对双引号字符串运行字符串操作,同时保持单引号字符串字面上不变。这曾经导致“优秀”开发人员选择对不包含控制字符的字符串使用单引号,例如\n
or \0
(不在单引号内处理),并在需要解析字符串时使用双引号(在 CPU 周期中花费少许处理字符串)。
如果您使用的是JSHint,那么如果您使用双引号字符串,它将引发错误。
我通过 AngularJS 的 Yeoman 脚手架使用它,但也许有某种方式可以配置它。
顺便说一句,当您将 HTML 处理为 JavaScript 时,使用单引号会更容易:
var foo = '<div class="cool-stuff">Cool content</div>';
并且至少 JSON 使用双引号来表示字符串。
没有任何简单的方法可以回答您的问题。
JavaScript 中的单引号和双引号没有任何区别。
规范很重要:
也许存在性能差异,但它们绝对是最小的,并且可以根据浏览器的实现随时更改。除非您的 JavaScript 应用程序有数十万行长,否则进一步讨论是徒劳的。
这就像一个基准,如果
a=b;
比
a = b;
(额外的空格)
今天,在特定的浏览器和平台等。
谈论性能,报价永远不会成为您的瓶颈。但是,两种情况下的性能是相同的。
谈到编码速度,如果您'
用于分隔字符串,则需要转义"
引号。您更有可能需要"
在字符串内部使用。例子:
// JSON Objects:
var jsonObject = '{"foo":"bar"}';
// HTML attributes:
document.getElementById("foobar").innerHTML = '<input type="text">';
然后,我更喜欢用它'
来分隔字符串,所以我必须转义更少的字符。
使用单引号的一个(愚蠢的)原因是它们不需要您按 shift 键来键入它们,而双引号则需要。(我假设平均字符串不需要转义,这是一个合理的假设。)现在,假设我每天编写 200 行代码。也许在这 200 行中,我有 30 个引号。输入双引号可能比输入单引号多花 0.1 秒的时间(因为我必须按下 shift 键)。然后在任何一天,我都会浪费 3 秒。如果我以这种方式编码每年 200 天,持续 40 年,那么我浪费了我生命中的 6.7 小时。深思熟虑。
检查利弊
赞成单引号
elem.innerHTML = '<a href="' + url + '">Hello</a>';
elem.innerHTML = "<a href='" + url + "'>Hello</a>";
此外,内联 HTML 通常是一种反模式。首选模板。
myJson = '{ "hello world": true }';
同样,您不必以这种方式构造 JSON。JSON.stringify() 通常就足够了。如果没有,请使用模板。
赞成双引号
赞成双方
两者在 JavaScript 中没有区别。因此,您可以使用目前方便的任何东西。例如,以下字符串文字都产生相同的字符串:
"He said: \"Let's go!\""
'He said: "Let\'s go!"'
"He said: \"Let\'s go!\""
'He said: \"Let\'s go!\"'
内部字符串用单引号,外部字符串用双引号。这使您可以将内部常量与要显示给用户(或写入磁盘等)的字符串区分开来。显然,您应该避免将后者放入您的代码中,但这并不总是可以做到的。
作为从双引号转换为单引号的原因,您可能要考虑的另一件事是服务器端脚本的流行度增加。使用 PHP 时,您可以使用 PHP 中的字符串和变量传递变量和解析 JavaScript 函数。
如果您编写一个字符串并为您的 PHP 使用双引号,您将不必转义任何单引号,PHP 将自动为您检索变量的值。
示例:我需要使用服务器中的变量运行 JavaScript 函数。
public static function redirectPage( $pageLocation )
{
echo "<script type='text/javascript'>window.location = '$pageLocation';</script>";
}
这为我在处理连接字符串时节省了很多麻烦,并且我可以有效地从 PHP 调用 JavaScript。这只是一个例子,但这可能是程序员在 JavaScript 中默认使用单引号的几个原因之一。
双引号字符串最重要的特性是变量名将被扩展。有关详细信息,请参阅字符串解析。
使用CoffeeScript时,我使用双引号。我同意你应该选择其中一个并坚持下去。CoffeeScript 在使用双引号时为您提供插值。
"This is my #{name}"
ECMAScript 6对模板字符串使用反引号 (`)。这可能有一个很好的理由,但是在编码时,将字符串文字字符从引号或双引号更改为反引号以获取插值功能可能很麻烦。CoffeeScript 可能并不完美,但在任何地方使用相同的字符串文字字符(双引号)并且始终能够进行插值是一个不错的功能。
`This is my ${name}`
有些人声称看到了性能差异:旧邮件列表线程。但我找不到任何一个可以确认的。
主要是查看您在字符串中使用了哪种引号(双引号或单引号)。它有助于保持较低的转义次数。例如,当您在字符串中处理 HTML 内容时,使用单引号会更容易,这样您就不必转义属性周围的所有双引号。
我一直在运行以下大约 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));
当不能使用单引号时,我会使用双引号,反之亦然:
"'" + singleQuotedValue + "'"
'"' + doubleQuotedValue + '"'
代替:
'\'' + singleQuotedValue + '\''
"\"" + doubleQuotedValue + "\""
现在是 2020 年,我们应该考虑 JavaScript 的第三种选择:所有内容的单个反引号。
这可以在任何地方使用,而不是单引号或双引号。
它可以让你做所有的事情!
在其中嵌入单引号: `这很棒!`
在其中嵌入双引号: `它“真的”很棒!`
使用字符串插值: `It's "${better}" than great!`
它允许多行: `
这
使
JavaScript
更好的!
`
替换其他两个字符串时也不会造成任何性能损失: 反引号 (``) 是否比 JavaScript 中的其他字符串慢?
在阅读了所有说它可能更快或可能有优势的答案之后,我会说双引号更好或者也可能更快,因为Google Closure 编译器将单引号转换为双引号。
如果您在 JavaScript 和 C# 之间来回切换,最好训练您的手指以适应双引号的常见约定。
严格来说没有区别,因此保持转义数较低主要取决于品味和字符串中的内容(或者 JavaScript 代码本身是否在字符串中)。
速度差异图例可能来自 PHP 世界,其中两个引号具有不同的行为。
如果您的 JavaScript 源代码是
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>
JavaScript 允许这样的数组:
var arr=['this','that'];
但是如果你把它串起来,那将是出于兼容性的原因:
JSON=["this","that"]
我确信这需要一些时间。
只是为了增加我的两分钱:几年前在使用 JavaScript 和 PHP 时,我已经习惯于使用单引号,因此我可以键入转义字符 ('') 而不必将其转义。我通常在输入带有文件路径等的原始字符串时使用它。
无论如何,我的约定最终变成了在标识符类型的原始字符串上使用单引号,例如if (typeof s == 'string') ...
(其中永远不会使用转义字符 - 永远),以及文本的双引号,例如“嘿,怎么了?”。我还在注释中使用单引号作为印刷约定来显示标识符名称。这只是一个经验法则,我只在需要时才中断,例如在键入 HTML 字符串时'<a href="#"> like so <a>'
(尽管您也可以在此处反转引号)。我也知道,在 JSON 的情况下,名称使用双引号 - 但除此之外,我个人更喜欢单引号,因为引号之间的文本从document.createElement('div')
不需要转义 - 比如.
底线是,正如一些人提到/暗示的那样,选择一个约定,坚持它,并且只在必要时偏离。
您可以使用单引号或双引号。
例如,这使您可以轻松地将 JavaScript 内容嵌套在 HTML 属性中,而无需转义引号。当您使用 PHP 创建 JavaScript 时也是如此。
总体思路是:如果可能,请使用不需要转义的引号。
更少的转义 = 更好的代码。
对我来说只是时间问题。每次我必须Shift在每次能够键入之前按下键时,我的生命都会损失几毫秒"
。
我更喜欢'
仅仅是因为你不必这样做!
除此之外,您可以'
使用反斜杠转义内部单引号\'
。
console.log('Don\'t lose time'); // "Don't lose time"
区别纯粹是风格上的。我曾经是一个双引号纳粹。现在我几乎在所有情况下都使用单引号。除了您的编辑器如何突出显示语法之外,没有任何实际区别。
对我来说,如果我在Vim编辑器中编写代码并且某些内容用单引号括起来,我可以双击以仅选择引号内的文本。另一方面,双引号包括引号,当我想做一些快速复制和粘贴时,我觉得很烦人。
例如,在 Vim 编辑器中双击 'myVar' 复制: >myVar< "myVar" 字面意思是复制: >"myVar"< 并且当我粘贴时,我必须删除两边的引号。
我大部分时间都使用单引号,因为在 PHP 中开发时,单引号字符串绝不会改变,这正是我想要的。当我使用
echo "$xyz";
在 PHP 中,$xyz 被评估,这不是我想要的。因此,当涉及到 Web 开发时,我总是使用'
而不是。"
因此,当涉及到 PHP/JavaScript 时,我至少要确保字符串的一致性。
不幸的是,这不能在 Java 或Objective-C中完成,其中''
代表字符并""
代表字符串。但这是另一个问题。
我认为重要的是不要忘记,虽然 Internet Explorer 可能安装了零扩展/工具栏,但 Firefox 可能安装了一些扩展(例如,我只是想Firebug)。这些扩展将对基准测试结果产生影响。
这并不重要,因为浏览器 X 在获取元素样式方面更快,而浏览器 Y 在渲染画布元素方面可能更快(因此浏览器“制造商”总是拥有最快的 JavaScript 引擎)。
如果您使用 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>
我更喜欢使用单引号,'
. 它更容易打字,看起来更好。
另外,让我们记住,直引号(单引号和双引号)在良好的排版中是一个错误。弯引号更可取,因此我更喜欢使用正确的字符,而不是转义直引号。
const message = 'That\'s a \'magic\' shoe.' // This is wrong
const message = 'That’s a ‘magic’ shoe.' // This is correct
https://practicaltypography.com/straight-and-curly-quotes.html
请问有人可以在 Visual Studio Code 中添加智能引用功能吗?
我认为这完全是方便/偏好的问题。
我更喜欢双引号,因为它与 C# 相匹配,这是我通常工作的环境:C# + JavaScript。
双引号超过单引号的一个可能原因是(我在我的项目代码中发现):法语或其他一些语言大量使用单引号(实际上就像英语一样),所以如果由于某种原因你最终从服务器端(我知道这是不好的做法),那么单引号将错误地呈现。
在常规语言中使用双引号的可能性很低,因此我认为它更有可能不破坏某些东西。
为了可读性,我个人更喜欢单引号。如果我整天盯着代码看,那么用单引号而不是双引号更容易看到单词。
更容易阅读,如下所示:
'易于阅读'
“更难阅读”
""最难读""
此外,规范(目前在MDN中提到)似乎没有说明单引号和双引号之间的任何区别,除了关闭和一些未转义的几个字符。但是,模板文字 (`) 假定需要额外的解析/处理。
字符串文字是用单引号或双引号括起来的 0 个或多个 Unicode 代码点。Unicode 代码点也可以由转义序列表示。除了结束引号代码点、
U+005C (REVERSE SOLIDUS)
、U+000D (CARRIAGE RETURN)
和U+000A (LINE FEED)
. 任何代码点都可能以转义序列的形式出现。字符串文字评估为 ECMAScript 字符串值...
正如其他答复所述,它们几乎相同。但我会尝试添加更多。
"
之前先看到 (#34),'
因此根据您的数据结构节省几个 CPU 周期。"
被反XSS引擎逃脱对于跨不同语言使用 JavaScript 代码,我发现单引号始终需要较少的代码调整。
双引号支持多行字符串。
最佳做法是在需要时先使用双引号 (""),然后使用单引号 ('')。原因是,如果您曾经使用服务器端脚本,如果您使用单引号而不是双引号,您将无法从服务器中提取内容(例如来自数据库的 SQL 查询)。