在JavaScript中声明多个变量

Ste*_*son 316 javascript variables performance coding-style declaration

在JavaScript中,可以声明多个这样的变量:

var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;
Run Code Online (Sandbox Code Playgroud)

......或者像这样:

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;
Run Code Online (Sandbox Code Playgroud)

一种方法比另一种方法更好/更快吗?

Jer*_*ten 323

第一种方式更容易维护.每个声明都是一行中的单个语句,因此您可以轻松添加,删除和重新排序声明.

使用第二种方法,删除第一个或最后一个声明是很烦人的,因为它们包含var关键字和分号.每次添加新声明时,都必须将旧行中的分号更改为逗号.

  • 如果您正在编写希望缩小或稍后打包的代码,则第二种方式允许压缩器(如YUI Compressor)为您提供更小的版本.如果考虑大小,那么我建议尽可能多地遵循JSLint的建议. (64认同)
  • jslint声称第二种方式更为正义,但我不同意. (34认同)
  • 第二种方式是微优化.所有var声明都是一次处理,而不是一次处理一次.在现代浏览器/现代计算机中,这并不重要. (26认同)
  • @ 0xc0de:我希望看到将一个语句中的所有变量声明为"高效"的证明.如果您只是根据节省的少量字节来衡量效率,那么也许.但是如果你考虑到可读性和可维护性,我认为你会发现过早优化通常是错误的方法,特别是因为现代浏览器会在执行前传递中收集和初始化范围内的所有变量.就个人而言,我发现所有变量都在一行或一个语句中声明,以便快速理解代码更容易出错. (16认同)
  • 关于效率,uglifyjs和谷歌闭包编译器都会自动将连续的var语句压缩成一个,使得这一点没有实际意义(据我所知,YUI不会这样做,但我还没有进行过广泛的测试). (6认同)
  • 只想添加Ben Alman撰写的一篇非常有趣的博客文章的链接,最终说服我使用多个var语句:http://benalman.com/news/2012/05/multiple-var-statements-javascript/ (3认同)
  • FWIW,当我所在的团队尝试使用单变量方法时,我们似乎在git中遇到了更多的合并问题.这种方式很有意义,因为当你改变任何东西时你必须编辑更多的代码行,正如Ben Alman的文章指出的那样.我们切换回使用多个`var`s. (2认同)

Ken*_* Ki 206

除可维护性外,第一种方法消除了事故全局变量创建的可能性:

(function () {
var variable1 = "Hello World!" // semicolon is missed out accidently
var variable2 = "Testing..."; // still a local variable
var variable3 = 42;
}());
Run Code Online (Sandbox Code Playgroud)

虽然第二种方式不太宽容:

(function () {
var variable1 = "Hello World!" // comma is missed out accidently
    variable2 = "Testing...", // becomes a global variable
    variable3 = 42; // a global variable as well
}());
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是严格模式,那么无论如何都无法创建这样的全局变量. (14认同)
  • 好点子.如果它们很短,那么写一行就可以避免这个问题:`var variable1 ="Hello World!",variable2 ="Testing ...",variable3 = 42;`.缺少`,`会崩溃,但我同意它有风险 (4认同)

小智 33

每个范围的组织使用一个var语句是很常见的.所有"范围"的方式都遵循类似的模式,使代码更具可读性.此外,无论如何,发动机将它们"升起"到顶部.所以保持你的声明在一起模仿实际发生的事情会更紧密.

  • 您可以将声明保持在一起,而不会使它们共享相同的'var'声明.我理解并接受jslint(你的链接)给出的解释,但我不同意这个结论.如上所述,风格比其他任何事情更重要.在Java世界(以及其他)中,建议使用反向(每行一个声明)以提高可读性. (6认同)

Jas*_*use 27

这样做时更具可读性:

var hey = 23;
var hi = 3;
var howdy 4;
Run Code Online (Sandbox Code Playgroud)

但是这样占用更少的空间和代码行:

var hey=23,hi=3,howdy=4;
Run Code Online (Sandbox Code Playgroud)

它可以是节省空间的理想选择,但让JavaScript压缩器为您处理它.


小智 15

也许是这样的

var variable1 = "hello world"
, variable2 = 2
, variable3 = "how are you doing"
, variable4 = 42;
Run Code Online (Sandbox Code Playgroud)

除了更改第一个或最后一个变量外,它易于维护和读取.

  • 通常,使用逗号优先,分号会换行以防止出现此问题.var variable1 ="hello world"\n,variable2 = 2 \n,variable3 ="你好吗?"\n,variable4 = 42 \n; \n (6认同)
  • 这是 Haskell 语法。我觉得不知何故在javascript中不推荐/常见做法 (3认同)

Bri*_*ell 14

这只是个人偏好的问题.这两种方式没有区别,除了用第二种形式保存的几个字节,如果你去掉空白区域.


小智 13

ECMAScript6引入了解构赋值,它非常好用:

[a, b] = [1, 2] a将等于1b将等于2.

  • 我认为如果你有很长的变量列表,你的方法并不是真正可行。很难说哪个值与哪个变量相关,而且在错误合并的情况下,您也无法避免错误,在此期间您可能会意外地从数组中删除一个元素。示例: ```let [aVar, bVar, cVar, xVar, yVar, zVar] = [10, 20, 30, 40, 50];``` 所以,我个人不推荐它。 (3认同)
  • 如果您想设置许多具有相同值的变量,这会很方便。例如,用于在循环中重置为零。 (2认同)

Kev*_*ell 11

var variable1 = "Hello World!";
var variable2 = "Testing...";
var variable3 = 42;
Run Code Online (Sandbox Code Playgroud)

比以下更具可读性:

var variable1 = "Hello World!",
    variable2 = "Testing...",
    variable3 = 42;
Run Code Online (Sandbox Code Playgroud)

但他们做同样的事情.


Roh*_*dal 9

使用ES6 Destructuring赋值:它将数组中的值或对象的属性解包为不同的变量.

let [variable1 , variable2, variable3] = 
["Hello World!", "Testing...", 42];

console.log(variable1); // Hello World!
console.log(variable2); // Testing...
console.log(variable3); // 42
Run Code Online (Sandbox Code Playgroud)

  • 这是一个糟糕的主意,尤其是当您需要分配大约10个变量时。 (4认同)

cod*_*ion 7

逗号中我唯一但必不可少的用法是for循环:

for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}
Run Code Online (Sandbox Code Playgroud)

我去这里查看JavaScript是否正常.

即使看到它起作用,仍然存在一个问题,即n是否是函数的局部.

这验证,n是本地的:

a=[3,5,7,11];
(function l () { for (var i = 0, n = a.length; i < n; i++) {
  var e = a[i];
  console.log(e);
}}) ();
console.log(typeof n == "undefined" ?
  "as expected, n was local" : "oops, n was global");
Run Code Online (Sandbox Code Playgroud)

有一会儿我不确定,在语言之间切换.


小智 6

虽然两者都是有效的,但是使用第二种方法会阻止没有经验的开发人员在所有地方放置var语句并导致提升问题.如果每个函数只有一个var,则在函数的顶部,则整个代码调试更容易.这可能意味着声明变量的行不像某些人所希望的那样明确.

我认为权衡是值得的,如果这意味着让开发人员不再在他们想要的任何地方放弃'var'.

人们可能会抱怨JSLint,我也是这样,但很多都不是为了解决语言问题,而是纠正编码人员的坏习惯,从而防止他们编写的代码出现问题.因此:

"在具有块范围的语言中,通常建议在首次使用的站点声明变量.但是因为JavaScript没有块范围,所以在函数顶部声明所有函数的变量是明智的.建议每个函数使用一个var语句." - http://www.jslint.com/lint.html#scope


Sch*_*ton 6

正如每个人所说,这很大程度上是偏好和可读性,但我会在帖子上发表评论,因为我没有看到其他人以这种方式分享想法

我认为这个问题的答案很大程度上取决于您设置的变量以及它们之间的关系。我尝试根据我创建的变量是否相关来保持一致;我的偏好通常是这样的:

对于不相关的变量

我将它们单线排列,以便以后可以轻松移动它们;我个人绝不会以任何其他方式声明不相关的项目:

const unrelatedVar1 = 1;
const unrelatedVar2 = 2;
const unrelatedVar3 = 3;
Run Code Online (Sandbox Code Playgroud)

对于相关的东西(实用程序)

如果我要创建新变量,我将其声明为一个块——这暗示着这些属性属于一起

const
  x = 1,
  y = 2,
  z = 3
;

// or
const x=1, y=2, z=3;

// or if I'm going to pass these params to other functions/methods
const someCoordinate = {
  x = 1,
  y = 2,
  z = 3
};
Run Code Online (Sandbox Code Playgroud)

对我来说,这与解构感觉更一致:

const {x,y,z} = someCoordinate;
Run Code Online (Sandbox Code Playgroud)

做类似的事情会感觉很笨拙(我不会这样做

const x = someCoordiante.x;
const y = someCoordiante.y;
const z = someCoordiante.z;
Run Code Online (Sandbox Code Playgroud)

对于相关的事情(建筑)

如果使用相同的构造函数创建多个变量,我通常也会将它们分组在一起;我个人认为这更具可读性

而不是类似的事情(我通常不这样做

const stooge1 = Person("moe");
const stooge2 = Person("curly");
const stooge3 = Person("larry");
Run Code Online (Sandbox Code Playgroud)

通常会这样做:

const [stooge1, stooge2, stooge3] = ["moe", "curly", "larry"].map(Person);
Run Code Online (Sandbox Code Playgroud)

我说通常是因为如果输入参数足够长以至于变得不可读,我会将它们分开。

我同意其他人关于 use-strict 的评论


v1r*_*00z 5

我认为这是个人偏好的问题.我更喜欢以下列方式进行:

   var /* Vars */
            me = this, that = scope,
            temp, tempUri, tempUrl,
            videoId = getQueryString()["id"],
            host = location.protocol + '//' + location.host,
            baseUrl = "localhost",
            str = "Visit W3Schools",
            n = str.search(/w3schools/i),
            x = 5,
            y = 6,
            z = x + y
   /* End Vars */;
Run Code Online (Sandbox Code Playgroud)


小智 5

避免使用单语句版本(单个var)的另一个原因是调试。如果在任何分配行中抛出异常,则堆栈跟踪仅显示一行。

如果您有10个用逗号语法定义的变量,则您将无法直接知道哪一个是罪魁祸首。

单个语句版本不会遭受这种歧义。


小智 5

可维护性问题可以通过一些格式轻松解决,例如:

let
  my_var1 = 'foo',
  my_var2 = 'bar',
  my_var3 = 'baz'
;
Run Code Online (Sandbox Code Playgroud)

我严格按照个人喜好使用这种格式。当然,我跳过这种格式的单一声明,或者它只是简单地把工作搞砸了。