console.log("double");
与 console.log('single');
我看到越来越多的JavaScript库在处理字符串时使用单引号。是什么原因导致一个人又一个人使用?我认为它们几乎可以互换。
alert("It's \"game\" time.");
还是alert('It\'s "game" time.');
?
console.log("double");
与 console.log('single');
我看到越来越多的JavaScript库在处理字符串时使用单引号。是什么原因导致一个人又一个人使用?我认为它们几乎可以互换。
alert("It's \"game\" time.");
还是alert('It\'s "game" time.');
?
Answers:
在不同的库中使用单一或双重的最可能原因是程序员的喜好和/或API一致性。除了保持一致之外,请使用最适合该字符串的那个。
使用其他类型的引号作为文字:
alert('Say "Hello"');
alert("Say 'Hello'");
这可能会变得复杂:
alert("It's \"game\" time.");
alert('It\'s "game" time.');
ES6中的另一个新选项是使用以下字符的Template文字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正式指定为使用双引号,这可能值得考虑,具体取决于系统要求。
alert('It’s “game” time')
vs. alert("It’s “game” time")
–无关紧要。你只需要在(罕见)情况下的单人或双人主要标志逃跑'
,"
实际上是合适的。
如果要处理JSON,则应注意严格来说,JSON字符串必须用双引号引起来。当然,许多库也支持单引号,但是在意识到一个单引号实际上不符合JSON标准之前,我在一个项目中遇到了很大的问题。
var jsonString = '{"key1":"value1"}';
(不,我建议手动构建JSON)
.stringify()
。
没有一个更好的解决方案 ; 但是,我想指出有时双引号可能更可取:
"
来标识引用的文本段落。如果我们使用单引号'
,则读者可能会将其误解为收缩。由括起来的一段文字的其他含义'
表示“口语”含义。与先前存在的语言保持一致是有意义的,这可能会简化代码的学习和解释。"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"
因此,这取决于您要转义多少报价。显然,双引号字符串中的双引号也是如此。
"{\"name\": \"Peter\"}"
VS '{"name": "Peter"}'
?诚然,您可以说这是相同的区别,但是它肯定会以与上述示例不同的方式影响您的决定。
我想说的是纯粹的风格上的差异,但我确实有疑问。考虑以下示例:
/*
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的现代版本不再这样做。
.toString
但现在它返回原始副本。现代Firefox不会有这个问题。
我相信,如果您正在执行内联JavaScript(可以说是“坏”事情,但避免了讨论),则单引号是字符串文字的唯一选择。
例如,这很好用:
<a onclick="alert('hi');">hi</a>
但是您无法通过我知道的任何转义方法将“ hi”用双引号引起来。即使"
这是我最好的猜测(因为您在HTML的属性值中转义了引号)在Firefox中对我也不起作用。 \"
也不起作用,因为此时您正在转义HTML,而不是JavaScript。
因此,如果游戏的名称是一致的,并且您将在应用程序的某些部分中使用一些内联JavaScript,则我认为单引号是赢家。如果我错了,请有人纠正我。
<a onclick="alert(%22hi%22);">hi</a>
-从内存来看,这是<a href="javascript:alert(%22hi%22);">hi</a>
alert("hi")
不是有效的JavaScript。但是属性值已编码。w3.org/TR/html4/intro/sgmltut.html#didx-attribute
"
是在HTML属性中转义双引号的正确方法。它在Firefox中运行良好。@ Denilson,XML(以及XHTML)允许单引号和双引号。请参阅AttValue
XML规范中的文字,网址为w3.org/TR/REC-xml/#d0e888。
从技术上讲,没有区别,只是样式和约定。
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
ES6更新
使用模板文字语法。
`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="https://stackoverflow.com/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中使用单引号。它可能会节省几个调试问题...
不知道这在当今世界是否有意义,但是双引号曾经用于需要处理控制字符的内容,而单引号则用于不需要处理的字符。
编译器将在双引号字符串上运行字符串操作,而单引号字符串实际上保持不变。这通常导致“好的”开发人员选择对不包含控制字符(例如\n
或\0
(不在单引号内处理)的字符串)使用单引号,并在需要解析字符串时使用双引号(对于处理字符串)。
如果您使用的是jshint,则使用双引号字符串将引发错误。
我通过AngularJS的Yeoman scafflholding使用它,但是也许可以通过某种方式进行配置。
顺便说一下,当您将HTML处理到JavaScript中时,使用单引号会更容易:
var foo = '<div class="cool-stuff">Cool content</div>';
至少JSON使用双引号表示字符串。
没有简单的方法可以回答您的问题
使用单引号的一个(愚蠢的)原因是它们不需要您按Shift键来键入它们,而双引号则需要。(我假设平均字符串不需要转义,这是一个合理的假设。)现在,让我们假设我每天编写200行代码。也许在这200行中,我有30个引号。也许输入双引号比输入单引号要花0.1秒的时间(因为我必须按Shift键)。然后在任何一天,我浪费3秒。如果我以这种方式进行编码,在40年中每年花费200天,那么我就浪费了6.7个小时。值得深思。
var description = "This is a \"quick\" test";
on对于英文键盘,小指必须从左Shift键向上移动到第一行的Q键,而不是从A键移动到Q键,换句话说,它的移动距离必须是两倍。我不确定这些键在德语键盘上的什么位置,但是我敢肯定有一个类似的例子
检查利弊
赞成单引号
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中使用单引号的几个原因之一。
来自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));
var dummy_date = new Date()
重新开始
完全没有区别,因此,保持转义数很低主要取决于口味和字符串中的内容(或者如果JS代码本身在字符串中)。
速度差异图例可能来自PHP世界,其中两个引号的行为不同。
阅读完所有可能会更快或更具有优势的答案后,我会说双引号会更好或更快速,因为Google闭包编译器会将单引号转换为双引号。
现在到了2020年,我们应该考虑Javascript的第三个选择:针对所有内容的单个反引号。
可以在任何地方使用它而不是单引号或双引号。
它可以让您做所有事情!
它允许多行: `
这个
使
Java脚本
更好!
`
替换其他两个时,它也不会造成任何性能损失:https : //medium.com/javascript-in-plain-english/are-backticks-slower-than-other-strings-in-javascript-ce4abf9b9fa
如果您的JS来源是:
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>
JS允许这样的数组:
var arr=['this','that'];
但是,如果将其字符串化,则出于兼容的原因:
JSON=["this","that"]
我确定这需要一些时间。
仅增加2美分:几年前使用JS和PHP时,我已经习惯于使用单引号,因此我可以键入转义字符('\'),而不必也对其进行转义。我通常在输入带有文件路径等的原始字符串时使用它。(http://en.wikipedia.org/wiki/String_literal#Raw_strings)
无论如何,我的约定最终变成了在标识符类型的原始字符串上使用单引号,例如if (typeof s == 'string') ...
(永远不会使用转义字符),对文本使用双引号,例如“嘿,怎么了?”。我还将注释中的单引号用作印刷惯例,以显示标识符名称。这只是一个经验法则,我只会在需要时才会中断,例如在键入HTML字符串时'<a href="#"> like so <a>'
(尽管您也可以在此处将引号反过来)。我还知道,在JSON的情况下,名称使用双引号-但除此之外,我个人更喜欢单引号,因为引号之间的文本永远不需要转义-例如document.createElement('div')
。
底线,正如某些人提到/暗示的那样,选择一个惯例,坚持使用它,仅在必要时偏离。