JavaScript 变量定义:逗号与分号

IT技术 javascript variables
2021-02-06 06:16:04

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

例如:

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

相对

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

我知道,如果您var在第一个示例中的第一个变量上指定关键字,它会在所有变量中持续存在,因此它们都会产生关于作用域的相同最终结果。这只是个人喜好,还是这样做对性能有好处?

6个回答

没有性能优势,只是个人选择和风格的问题。

第一个版本更简洁。


更新:

就通过网络传输的数据量而言,当然越少越好,但是您需要大量删除的var声明才能看到真正的影响。

已经提到缩小是第一个示例将有助于更好地缩小的东西,但是,正如Daniel Vassallo在评论中指出的那样,一个好的缩小器无论如何都会自动为你做这件事,所以在这方面没有任何影响。

@Oded - 缩小符合性能问题。因此,如果一种风格有助于更好地缩小,那么它就会间接导致性能问题
2021-03-14 06:16:04
是的,你是对的。出于好奇,我创建了一个测试(jsperf.com/...),运行了 5 次,得到了 5 个不同的答案。所以,嗯,是的,这完全取决于风格和个人喜好,而不是性能。
2021-03-16 06:16:04
@Ryan:好的压缩器,例如 Google Closure Compiler 会将多个 var 语句合并为一个:img840.imageshack.us/img840/3601/closurecompilerservice.jpg
2021-03-22 06:16:04
@Ryan Kinal - 您在问题中的哪个位置看到了缩小?
2021-03-23 06:16:04
缩小 javascript 会带来性能优势。
2021-03-30 06:16:04

在阅读 Crockford 和其他人之后,我开始专门用逗号链接我的变量。后来,我真的对 Chrome DevTools 调试器感到恼火,它不会停在带有逗号的变量定义处。对于调试器,用逗号链接的变量定义是单个语句,而多个 var 语句是调试器可以停止的多个语句。因此,我从以下位置切换回来:

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

到:

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

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

“通过电线减少代码”的论点没有说服力,因为有缩小器。

值得一提的是,第一种形式可能会错误地让您认为 b 或 c 是全局的。
2021-03-23 06:16:04
第二个变体也使 git 历史记录更清晰。不必在添加另一个变量或冒险创建全局变量之前将尾随的分号更改为逗号,而只需添加一个完整的 var 语句。
2021-03-26 06:16:04
我自己确实经历过这种情况。我通常只是在需要检查某些内容的地方拆分声明debugger,然后将a放入其中,然后添加另一个var并保持逗号链接它们。然后当我完成调试后,我回去删除debugger和额外的var.
2021-03-30 06:16:04

我更喜欢这样的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.难读

行乞中的 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符号

有关这种丑陋风格(逗号而不是另一个变量)的示例,请参阅stackoverflow.com/questions/37332155/...
2021-04-10 06:16:04

我同意其他回答者的意见,这主要是个人风格问题。但是为了在讨论中引入“权威”意见,Douglas Crockford在流行的 JSLint 工具网站是这样说的

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

@BlackVegetable 不仅let可用于 Mozilla JS(请参阅此处)。它是ES6 规范的一部分,但大多数浏览器仍在努力实现 ES6 的特性。
2021-03-22 06:16:04
值得注意的是,Mozilla Javascript(通过let构造)确实具有块作用域。
2021-03-27 06:16:04

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

另一方面,同一位作者Douglas Crockford说在他的编码约定中将每个变量放在自己的行中因此var,如果您使用 JSLint,您可能希望取消选中“每个功能一个”复选框。;-)

他是对的。大多数语言都建议将变量放在单独的行上,因为源代码控制合并算法通常通过将每一行作为纯文本(而不是一行中的词法语句)进行比较来工作。如果两个人编辑同一个函数,在同一行声明多个变量几乎肯定会导致合并冲突,而单独的行几乎总是可以自动合并。(无论它们是否被声明为单独的var语句或用逗号链接。)
2021-04-03 06:16:04
“他是对的。” 更准确地说,异端是对的。Crockford 在某些时候改变了推荐和 JSLint 代码的风格。它曾经要求var每个块一个,可能有多个变量。它现在不仅支持letconst(但后来适当地禁止var),而且需要为每个变量单独声明。这是 JSLint 最鲜明的 180 年代之一。
2021-04-05 06:16:04