JavaScriptvariables定义:逗号与分号

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

例如:

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

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

我知道,如果你在第一个例子中的第一个variables上指定了var关键字,它将在所有variables中保持不变,所以它们都会产生关于范围的相同的最终结果。 这只是个人偏好,还是有一个性能上的好处呢?

没有性能好处,只是个人select和风格的问题。

第一个版本更简洁。


更新:

就数据传输量而言,当然越less越好,但是为了看到真正的影响,你需要去掉大量的var声明。

缩小被认为是第一个例子将有助于更好的缩小,但是,正如丹尼尔·瓦萨洛在评论中指出的那样,一个好的缩小器会自动为你做,所以在这方面没有任何影响。

有趣的事实:在JavaScript中,您可以使用逗号将任意数量的expression式组合成单个语句。 这基本上是for语句的工件,其中多个赋值expression式经常在标题中组合在一起。 大多数人不知道这样的语法在for循环之外仍然有效。 所以你可以做到这一点

 var i = 0; while (i < 10) alert(i + ' * ' + i + ' = '), alert(i * i + '!!'), i++; alert("Wasn't that fun??"); 

代替

 var i = 0; while (i < 10) { alert(i + ' * ' + i + ' = '); alert(i * i + '!!'); i++; } alert("Wasn't that fun??"); 

虽然大多数人会build议你不要。

语句,如var ,不能用这种方式。 那就是你不能在一堆其他逗号分隔的expression式中间有var

无论如何…你知道得越多

读完Crockford和其他人后,我开始用逗号独占链接variables。 然后,我真的被Chrome DevToolsdebugging器所困扰,它不会停留在用逗号variables定义的地方。 对于debugging器,用逗号链接的variables定义是单个语句,而多个var语句是debugging器可以停止的多个语句。 所以,我转回来了:

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

至:

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

到现在为止,我发现第二个变体更加清洁,更不用提其解决debugging器问题的优势了。

“通过电线less代码”的说法是不具说服力的,因为有缩小。

我更喜欢var-per-variable表示法:

 var a = 2 var b = 3 

因为另一个comma-instead-of-another-var符号有这三个缺点:

1.难以维护
考虑这个代码:

 var a = 1, b = mogrify(2), c = 3 

但是,嘿,这个mogrify是做什么的? 让我们打印b来找出:

 var a = 1, b = mogrify(2), console.log(b) c = 3 

打破东西

2.难以阅读

乞讨中的variables清楚地表明将会有一个新的variables发起。

 var get_all_unicorn_promise = db.get_all_unicorns((unicorn) => { unicorn.legs.map((leg) => { leg.log('yes') }) }).sort(), c = 3 

到底在做什么?

3.不一致

考虑一下:

 var a = 1, b = 2, c = 3 

var-per-variable都遵循相同的结构。 用comma-instead-of-another-varvariables,第一个variables的声明方式不同于其他variables。 如果你决定在循环中移动第一个variables,你必须在variables的中间添加var

除了优先select,似乎大多数值得注意的项目使用var-per-variable符号

我同意其他答复者的意见,这主要是个人风格的问题。 但是为了给这个讨论带来一个“权威”的观点, Douglas Crockford 在stream行的JSLint工具的网站上说道 :

但是因为JavaScript没有块范围,所以在函数顶部声明一个函数的所有variables是明智的。 build议每个函数使用一个var语句。 这可以通过onevar选项强制执行。

正如其他人所指出的,这是一种风格偏好。 JSLint可能会告诉你每个函数只有一个variables(如果你使用“Good Parts”)。 因此,如果使用JSLint来检查你的代码(不是一个坏主意,恕我直言),你将最终使用比后者更多的第一种格式。

另一方面,同一个作者道格拉斯·克罗克福德 ( Douglas Crockford )说,在他的编码惯例中把每个variables放在一行中。 所以,如果你使用它,你可能想取消选中JSLint中的“All Function var per function”checkbox。 😉

第一个可以保存几个字符 – 所以在JS文件大小方面节省很less,因此带宽消耗也很less。 只有在极端的情况下,才会变得明显。

如果你正在缩小你的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部分

由于我没有看到它的任何引用, 这里是一个链接到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 

你可以从中得到什么是使用逗号或不是无关紧要。 无论哪种方式,它最终被parsing为一个VariableDeclaration和被视为完全相同。 脚本引擎如何处理这两个声明应该没有区别。 唯一的区别是在其他答案中已经提到的区别 – 节省更多的空间,并且在编译脚本时,应用语法来查找所有的VariableDeclarations花费的时间差别实际上是不可估量的。

我更喜欢第二个版本(每个都有自己的var )。 我认为这是因为我来自C ++背景。 在C ++中,你可以象你在第一个例子中那样声明variables,但是它会被弄糊涂(当你试图以这种方式创build指针时,很容易导致错误)。

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

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

 var one ,two ,three ,four ; 

因为它更短,可以说是更可读,没有噪音看。