在声明一组变量而不是分号时使用逗号有什么区别和/或优势(如果有)。
例如:
var foo = 'bar', bar = 'foo';
与
var foo = 'bar';
var bar = 'foo';
我知道,如果您var
在第一个示例中的第一个变量上指定了关键字,则该关键字在所有变量中都将保留,因此它们在范围方面都会产生相同的最终结果。仅仅是个人喜好,还是通过这两种方式都能获得性能上的好处?
Answers:
没有性能优势,仅取决于个人选择和风格。
第一个版本更加简洁。
更新:
就通过网络传输的数据量而言,少则固然更好,但是var
要想看到真正的影响,您将需要处理大量已删除的声明。
提到最小化是第一个示例将有助于更好地实现最小化的内容,但是,正如Daniel Vassallo在评论中指出的那样,优秀的缩小器将自动为您做到这一点,因此在这方面没有任何影响。
在阅读了Crockford和其他文章之后,我开始用逗号将变量专有地链接起来。然后,我真的被Chrome DevTools调试器烦恼,该调试器不会以逗号分隔变量定义。对于调试器,用逗号链接的变量定义是单个语句,而多个var语句是调试器可以在其处停止的多个语句。因此,我从以下位置切换回去:
var a = doSomethingA,
b = doSomethignB,
c = doSomethingC;
至:
var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;
到现在为止,我发现第二种变体更清洁,更不用说它解决调试器问题的优势了。
由于存在缩小符,因此“通过代码传递较少的代码”的论据没有说服力。
debugger
,然后在其中放一个,然后添加另一个var
并用逗号链接它们。然后,当我完成调试后,我返回并删除debugger
和var
。
我更喜欢这样的var-per-variable
符号:
var a = 2
var b = 3
因为其他comma-instead-of-another-var
表示法具有以下三个缺点:
1.难以维护
考虑以下代码:
var a = 1,
b = mogrify(2),
c = 3
但是,嘿,the子做什么?让我们打印b找出:
var a = 1,
b = mogrify(2),
console.log(b)
c = 3
打破东西
2.难以阅读
该行开头的var清楚地表明将启动一个新变量。
var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => {
unicorn.legs.map((leg) => {
leg.log('yes')
})
}).sort(),
c = 3
到底该怎么c = 3
办?
3.不一致
考虑一下:
var a = 1,
b = 2,
c = 3
随着var-per-variable
每一个声明遵循相同的结构。随着comma-instead-of-another-var
第一个变量比其他不同的方式申报。例如,如果您决定将第一个变量移至for循环内,则必须在声明的中间添加var
除首选项外,似乎大多数著名项目都使用该var-per-variable
符号
我同意其他答复者的意见,这主要是个人风格问题。但带来的“权威”的意见到讨论中,这就是道格拉斯·克罗克福德说,关于流行的JSLint工具的网站:
但是因为JavaScript没有块作用域,所以在函数顶部声明一个函数的所有变量是比较明智的。建议每个函数使用一个var语句。可以使用该
onevar
选项强制执行。
let
构造)确实具有块作用域。
正如其他人指出的那样,这是一种样式偏爱。JSLint可能会告诉您只有一个var
每个功能(如果您使用“ Good Parts”)。因此,如果使用JSLint来检查代码(恕我直言,恕我直言),您将最终使用第一种格式而不是后者。
另一方面,同一位作者道格拉斯·克罗克福德(Douglas Crockford)说,应将每个变量放在自己的编码约定中。因此var
,如果使用JSLint,则可能要取消选中“每个功能全部”复选框。;-)
var
语句还是用逗号分隔。)
我认为没有什么明显的区别,就我而言,这只是个人喜好。
我讨厌有多个var声明,所以我通常这样做:
var
one
,two
,three
,four
;
由于它更短并且更具可读性,因此没有任何var
噪音。
var one, two, three four;
非常快。在JavaScript中添加行可能很危险(JS解释器可以插入自己的;
行-如果您不希望这样做,则会很快发现副作用。而且,导致,
我的bug ,关键字让自己的电话困扰我,就让我;
的电话困扰我。您是按行付款的吗?
var
声明的中间。(尽管我同意大家之间关于逗号的前置var
以及最后的分号都按自己的
由于我看不到任何引用,因此这里是ECMA-262规范的链接,该规范是JavaScript的基础规范。该页面的语法说:
12.2 Variable Statement
Syntax
VariableStatement :
var VariableDeclarationList ;
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList , VariableDeclaration
VariableDeclarationListNoIn :
VariableDeclarationNoIn
VariableDeclarationListNoIn , VariableDeclarationNoIn
VariableDeclaration :
Identifier Initialiseropt
VariableDeclarationNoIn :
Identifier InitialiserNoInopt
Initialiser :
= AssignmentExpression
InitialiserNoIn :
= AssignmentExpressionNoIn
您可以从中收集的内容是使用逗号还是不使用逗号。无论哪种方式,它最终都被解析为aVariableDeclaration
并被视为完全相同。脚本引擎对待两个声明的方式应该没有什么区别。唯一的区别就是其他答案中已经提到的区别–节省了更多空间,并且在VariableDeclarations
编译脚本时应用语法发现所有内容所需的时间几乎没有多少差异。
第一个节省了几个字符-因此,就JS文件大小和带宽消耗而言,节省的很少。这种情况只有在极端情况下才会引起注意。
我更喜欢第二个版本(每个版本都有自己的var
)。我认为那是因为我来自C ++背景。在C ++中,您可以像在第一个示例中一样声明变量,但是它被皱眉了(在尝试以这种方式创建指针时,很容易导致错误)。
var
压缩,则重复的s不会明显增加gzip压缩的文件大小(如果我正确理解gzip压缩的话)。