JavaScript变量定义:逗号与分号


88

在声明一组变量而不是分号时使用逗号有什么区别和/或优势(如果有)。

例如:

var foo = 'bar', bar = 'foo';

var foo = 'bar';
var bar = 'foo';

我知道,如果您var在第一个示例中的第一个变量上指定了关键字,则该关键字在所有变量中都将保留,因此它们在范围方面都会产生相同的最终结果。仅仅是个人喜好,还是通过这两种方式都能获得性能上的好处?

Answers:


72

没有性能优势,仅取决于个人选择和风格。

第一个版本更加简洁。


更新:

就通过网络传输的数据量而言,少则固然更好,但是var要想看到真正的影响,您将需要处理大量已删除的声明。

提到最小化是第一个示例将有助于更好地实现最小化的内容,但是,正如Daniel Vassallo在评论中指出的那样,优秀的缩小器将自动为您做到这一点,因此在这方面没有任何影响。


8
缩小javascript的效果。
Ryan Kinal 2010年

1
@Ryan Kinal-您在问题中到底提到了哪里?
Oded

2
@Oded-缩小符合性能考虑。因此,如果一种样式适合更好地缩小尺寸,那么它间接地适合于性能问题
STW 2010年

7
@Ryan:像Google Closure Compiler这样的优秀工具可以将多个var语句合并为一个:img840.imageshack.us/img840/3601/closurecompilerservice.jpg
Daniel Vassallo 2010年

2
你是对的。出于好奇,我创建了一个测试(jsperf.com/…),运行了5次,并得到5个不同的答案。所以,嗯,是的,这都是关于风格和个人喜好,而不是性能。
Derek Henderson

29

在阅读了Crockford和其他文章之后,我开始用逗号将变量专有地链接起来。然后,我真的被Chrome DevTools调试器烦恼,该调试器不会以逗号分隔变量定义。对于调试器,用逗号链接的变量定义是单个语句,而多个var语句是调试器可以在其处停止的多个语句。因此,我从以下位置切换回去:

var a = doSomethingA,
    b = doSomethignB,
    c = doSomethingC;

至:

var a = doSomethingA;
var b = doSomethignB;
var c = doSomethingC;

到现在为止,我发现第二种变体更清洁,更不用说它解决调试器问题的优势了。

由于存在缩小符,因此“通过代码传递较少的代码”的论据没有说服力。


1
我本人实际上已经经历过。我通常只是在需要检查某些内容的地方拆分声明debugger,然后在其中放一个,然后添加另一个var并用逗号链接它们。然后,当我完成调试后,我返回并删除debuggervar
Collin Klopfenstein 2014年

7
第二个变种也使git history更干净。不必在添加另一个变量或冒创建全局变量的风险之前将尾部分号更改为逗号,只需添加完整的var语句即可。
payne8

提一下,第一种形式会错误地使您认为b或c是全局的。
garg10may

18

我更喜欢这样的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符号


对于这个丑陋的风格(逗号INSTEAD-OF-另一-VAR)做的事,迷惑人的例子,看到stackoverflow.com/questions/37332155/...
斯科特韦弗

7

我同意其他答复者的意见,这主要是个人风格问题。但带来的“权威”的意见到讨论中,这就是道格拉斯·克罗克福德说,关于流行的JSLint工具的网站

但是因为JavaScript没有块作用域,所以在函数顶部声明一个函数的所有变量是比较明智​​的。建议每个函数使用一个var语句。可以使用该onevar选项强制执行。


6
可能值得注意的是,Mozilla Javascript(通过let构造)确实具有块作用域。
BlackVegetable

3
@BlackVegetable不仅let可以在Mozilla JS中使用(请参阅此处)。它是ES6规范的一部分,但是大多数浏览器仍在努力实现ES6的功能。
mbomb007 '16

3

正如其他人指出的那样,这是一种样式偏爱。JSLint可能会告诉您只有一个var每个功能(如果您使用“ Good Parts”)。因此,如果使用JSLint来检查代码(恕我直言,恕我直言),您将最终使用第一种格式而不是后者。

另一方面,同一位作者道格拉斯·克罗克福德Douglas Crockford)说,应将每个变量放在自己的编码约定中。因此var,如果使用JSLint,则可能要取消选中“每个功能全部”复选框。;-)


1
他是对的。在大多数语言中,建议将变量放在单独的行上,因为源代码控制合并算法通常通过将每一行作为纯文本进行比较(而不是一行中的词法声明)来工作。如果两个人编辑同一函数,则几乎可以肯定在同一行上声明多个变量会导致合并冲突,而几乎总是可以自动合并单独的行。(无论它们被声明为单独的var语句还是用逗号分隔。)
Richard Dingwall 2014年

2

我认为没有什么明显的区别,就我而言,这只是个人喜好。

我讨厌有多个var声明,所以我通常这样做:

var 
   one
  ,two
  ,three
  ,four
;

由于它更短并且更具可读性,因此没有任何var噪音。


22
“可以争论”的关键字。如果我在我们的这个样本中发现它,它将变得var one, two, three four;非常快。在JavaScript中添加行可能很危险(JS解释器可以插入自己的;行-如果您不希望这样做,则会很快发现副作用。而且,导致,我的bug ,关键字让自己的电话困扰我,就让我;的电话困扰我。您是按行付款的吗?
STW 2010年

8
@STW-您可以自动插入分号,就像随机的东西一样,取决于各个浏览器的异想天开,但实际上,它仅根据一组定义良好的规则发生,而您不必担心它可能会在您var声明的中间。(尽管我同意大家之间关于逗号的前置var以及最后的分号都按自己的
说法行事

1
我认为这并不能真正回答问题,因为问题不关乎个人喜好。
基思·品森

2

由于我看不到任何引用,因此这里是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编译脚本时应用语法发现所有内容所需的时间几乎没有多少差异。


1

第一个节省了几个字符-因此,就JS文件大小和带宽消耗而言,节省的很少。这种情况只有在极端情况下才会引起注意。


假设您没有缩小文件,而且-认真的说,如今谁不缩小其文件?
Keith Pinson 2014年

1

我更喜欢第二个版本(每个版本都有自己的var)。我认为那是因为我来自C ++背景。在C ++中,您可以像在第一个示例中一样声明变量,但是它被皱眉了(在尝试以这种方式创建指针时,很容易导致错误)。


1
有趣的是,但是我不确定这是否可以回答此JavaScript语法的实际优点和缺点是什么。
Keith Pinson 2014年

1

如果您要缩小JavaScript的话,会有很大的好处:

var one, two, three, four;

变成

var a, b, c, d;

在哪里

var one;
var two;
var three;
var four;

变成

var a;
var b;
var c;
var d;

这是的另外三个实例var,这些实例会随着时间的推移而增加。

请参阅“ A List Apart”文章系列“更好的Javascript缩小”第1部分第2部分


6
优秀的缩小器,例如Google Closure Compiler,会将多个var语句合并为一个:img840.imageshack.us/img840/3601/closurecompilerservice.jpg。因此,仅当您使用智能程度较低的缩小器时,此参数才有效……您不应该这样做:)
Daniel Vassallo 2010年

2
而且,如果您要进行gzipvar 压缩,则重复的s不会明显增加gzip压缩的文件大小(如果我正确理解gzip压缩的话)。
Paul D. Waite,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.