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-var
variables,第一个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 ;
因为它更短,可以说是更可读,没有噪音看。