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
:
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标准之前,我在其中一个项目中遇到了很大问题.
没有更好的解决方案 ; 但是,我想有时候双引号可能更令人满意:
新手已经熟悉他们语言的双引号.在英语中,我们必须使用双引号"
来标识引用文本的段落.如果我们使用单引号'
,读者可能会将其误解为收缩.被文字包围的文本段落的另一个含义'
表示"口语"含义.与预先存在的语言保持一致是有意义的,这可能会简化代码的学习和解释.
双引号消除了逃避撇号的需要(如在收缩中).考虑字符串:"I'm going to the mall"
,与其他转义版本:'I\'m going to the mall'
.
双引号表示许多其他语言中的字符串.当您学习Java或C等新语言时,始终使用双引号.在Ruby,PHP和Perl中,单引号字符串表示没有反斜杠转义,而双引号支持它们.
JSON表示法用双引号编写.
尽管如此,正如其他人所说的那样,保持一致是最重要的.
该唯一的区别表现在以下:
'A string that\'s single quoted' "A string that's double quoted"
所以,这只取决于您想要做多少报价.显然,同样适用于双引号字符串中的双引号.
我希望双引号是标准,因为它们更有意义,但我一直使用单引号,因为它们支配着场景.
单引号:
制作的Airbnb
Facebook的
谷歌
咕噜
吞
节点
npm(虽然未在作者指南中定义)
维基媒体
WordPress的
Yandex的
没有偏好:
three.js所
双引号:
克罗克福德
d3(虽然未定义.eslintrc
)
jQuery的
我想说的不同之处纯粹是风格,但我真的很怀疑.请考虑以下示例:
/* 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时才有意义.
结论:我认为我们需要对此进行更多研究.
编辑:这可能解释了Peter-Paul Koch在2003年的测试结果.
在资源管理器Windows中,单引号似乎有时更快(大约1/3的测试确实显示出更快的响应时间),但如果Mozilla完全显示出差异,则它会稍快处理双引号.我发现Opera没有任何区别.
编辑2014:现代版本的Firefox/Spidermonkey不再这样做了.
如果您正在使用内联JavaScript(可以说是一个"坏"的东西,但是避免讨论)单引号是字符串文字的唯一选择,我相信.
例如,这很好用:
hi
但是你不能通过我所知道的任何转义方法将"hi"包装在双引号中.即使"
哪个是我最好的猜测(因为你在HTML的属性值中转义引号)在Firefox中对我不起作用. \"
也不会工作,因为此时你正在逃避HTML,而不是JavaScript.
因此,如果游戏的名称是一致的,并且您将在应用程序的某些部分中执行一些内联JavaScript,我认为单引号是赢家.如果我错了,请有人纠正我.
从技术上讲,没有区别,只有风格和惯例才有问题.
Douglas Crockford建议对内部字符串使用单引号,对外部使用双引号(外部我们指的是向应用程序用户显示的那些,如消息或警报).
我亲自关注.
更新:Crockford先生似乎改变主意,现在建议在整个过程中使用双引号:)
严格来说,意义上没有区别; 所以选择归结为方便.
以下几个因素可能会影响您的选择:
房屋风格:一些开发商团体已经使用一种或多种惯例.
客户端要求:您是否在字符串中使用引号?(见Ady的回答).
服务器端语言:VB.Net人们可能会选择对java脚本使用单引号,以便脚本可以在服务器端构建(VB.Net对字符串使用双引号,因此java脚本字符串很容易区分如果他们使用单引号).
库代码:如果您使用的是使用特定样式的库,您可以考虑自己使用相同的样式.
个人偏好:你可能会看到一种或其他风格看起来更好.
让我们看一下参考文献的作用.
在jquery.js中,每个字符串都是双引号.
所以,从现在开始,我将使用双引号字符串.(我用的是单身!)
我希望我没有添加一些明显的东西,但我一直在努力研究Django和Ajax以及JSON.
假设在你的HTML代码中你确实使用双引号,正如通常应该的那样,我强烈建议在JavaScript中使用单引号.
所以我同意@ady,但要小心.
我的底线是:在JavaScript中可能无关紧要,但只要将其嵌入HTML或类似内容中,您就会开始遇到麻烦.你应该知道什么是实际逃逸,阅读,传递你的字符串.
我的简单案例是:
tbox.innerHTML = tbox.innerHTML + ''
你可以在showThis的第三个字段中找到\'.
双引号不起作用!
很清楚为什么,但也很明显为什么我们应该坚持单引号......我猜...
这种情况是一个非常简单的HTML嵌入,错误是通过"双引号"JavaScript代码中的简单复制/粘贴生成的.
所以回答这个问题:
尝试在HTML中使用单引号.它可能会节省一些调试问题......
这主要是风格和偏好的问题.在其他答案中有一些相当有趣和有用的技术探索,所以也许我唯一可能添加的是提供一些世俗的建议.
如果你是在公司或团队中编码,那么遵循"家庭风格"可能是一个好主意.
如果你独自攻击一些辅助项目,那么请看一下社区中的一些杰出领导者.比如让我们说你进入了Node.js. 看看核心模块,例如underscore.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
ES6更新
使用模板文字语法.
`Be "my" guest. You're in complete freedom.`; // most comfort :D
不确定这在当今世界是否相关,但是双引号曾用于需要处理控制字符的内容,而单引号则用于没有处理控制字符的字符串.
编译器将对双引号字符串运行字符串操作,同时保留单引号字符串字面上不变.这曾经导致'好'开发人员选择对不包含控制字符的字符串使用单引号(\n
或\0
不在单引号内处理)和双引号时需要解析字符串(在cpu周期中略有成本)处理字符串).
如果您使用的是jshint,则在使用双引号字符串时会引发错误.
我通过AngomanJS的Yeoman脚手架使用它,但也许有某种方式来配置它.
顺便说一下,当你将HTML处理成JavaScript时,使用单引号更容易:
var foo = 'Cool content';
并且至少JSON使用双引号来重现字符串.
没有简单的方法来回答你的问题
谈到性能,引用永远不会成为你的瓶颈,但是,两种情况下的性能都是相同的.
谈论编码速度,如果'
用于分隔字符串,则需要转义"
引号."
在示例中,您更可能需要在字符串中使用:
//JSON Objects: var jsonObject = '{"foo":"bar"}'; //HTML attributes: document.getElementById("foobar").innerHTML = '';
然后,我更喜欢'
用于分隔字符串,所以我必须逃避更少的字符.
使用单引号的一个(愚蠢)理由是它们不需要您按Shift键来键入它们,而双引号则需要.(我假设平均字符串不需要转义,这是一个合理的假设.)现在,让我们假设我每天编写200行代码.也许在这200行中我有30个引号.也许输入双引号比输入单引号花费0.1秒(因为我必须按下shift键).然后在任何一天,我浪费3秒.如果我以这种方式编码,每年200天,40年,那么我浪费了6.7小时的生命.值得深思.
检查利弊
赞成单引号
减少视觉混乱.
生成HTML:HTML属性通常用双引号分隔.
elem.innerHTML = 'Hello';
您可能需要考虑的另一件事是从双引号转换为单引号的原因是服务器端脚本的流行度增加.使用PHP时,您可以使用PHP中的字符串和变量传递变量并解析javascript函数.
如果您编写一个字符串并为PHP使用双引号,则不必转义任何单引号,PHP将自动为您检索变量的值.
示例:我需要使用服务器中的变量运行javascript函数.
public static function redirectPage( $pageLocation ) { echo ""; }
这为我不得不处理加入字符串带来了很多麻烦,我可以有效地从PHP调用javascript.这只是一个例子,但这可能是程序员在javascript中默认使用单引号的几个原因之一.
引用PHP文档:"双引号字符串最重要的特性是变量名称将被扩展.有关详细信息,请参阅字符串解析."
有些人声称会看到性能差异:旧的邮件列表线程.但我找不到任何一个被证实.
主要是看你在字符串中使用什么样的引号(双或单).它有助于保持低逃逸的数量.例如,当您在字符串中使用html时,使用单引号更容易,这样您就不必转义属性周围的所有双引号.
当单引号不能使用时我会使用双引号,反之亦然:
"'" + singleQuotedValue + "'" '"' + doubleQuotedValue + '"'
代替:
'\'' + singleQuotedValue + '\'' "\"" + doubleQuotedValue + "\""
JavaScript中的单引号和双引号没有区别.
规格很重要:
也许存在性能差异,但它们绝对是最小的,并且可以根据浏览器的实现每天更改.除非您的JavaScript应用程序长达数十万,否则进一步的讨论是徒劳的.
这就像是一个基准
a=b;
比...更快
a = b;
(额外空间)
今天,在特定的浏览器和平台等
使用CoffeeScript时,我使用双引号.我同意你应该选择任何一个并坚持下去.CoffeeScript在使用双引号时为您提供插值.
"This is my #{name}"
ES6正在使用返回刻度(`)作为模板字符串.这可能有一个很好的理由,但是在编码时,将字符串文字字符从引号或双引号更改为返回标记以获得插值功能可能很麻烦.CoffeeScript可能不完美,但在任何地方使用相同的字符串文字字符(双引号)并始终能够插值是一个很好的功能.
`This is my ${name}`
我已经运行了以下约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));
如果你在JavaScript和C#之间跳回来,最好训练你的双手引号的常见约定.