如何在单个声明中将多个局部变量设置为相同的值?

时间:2016-03-09 22:18:46

标签: javascript

请考虑以下事项:

(function(){
   var foo = bar = 1;
}());
  • foo 将是函数的本地变量
  • bar 将是窗口的全局变量

由于它们的范围,两个变量在函数内的值都为1,但 bar 将在函数外部保留(在全局范围内)。

我很好奇是否有办法使用赋值运算符来初始化变量,没有循环或对象。我正在寻找一个关键字或前缀,使 bar 本地作用域。这个想法是干燥和有效的。

编辑: 上面的例子很简单。使用10个变量的一个选项可能是在初始化变量之前将变量预先声明到本地范围:

var foo, bar, baz, foobar, foobaz, bazfoo, barbaz,
    bazbar = foo = bar = baz = foobar = foobaz = barbaz = true;

然而,这样做既重复又难以阅读。一个人可以使用数组或对象,但这不太清晰,更混乱。

背景是另一个开发人员正在函数内部var foo = bar = true,我指出它只设置一个局部变量。他们没有意识到这一点,并且想要改变并询问是否可以内联和设置多个局部变量,而不是多次键入每个变量(而不是重构代码/数组或对象)。

在最初问这个问题时,我接触过ES6,但尚未完全阅读这些文档。我的想法是ES6有一些很好的功能(例如,休息,解构赋值),所以它也可能提供了一种方法来将大块变量大量初始化为相同的范围和值。

3 个答案:

答案 0 :(得分:7)

您不能(或不应该)为未声明的变量分配值。

然后,当您想要使用相同的值声明多个变量时,您可以

  • 为每个变量分配相同的值:

    var var1 = value,
        var2 = value,
        /* ... */
        varN = value;
    

    如果value是一个昂贵的表达式,您可以使用var1而不是重复value来避免每次重新计算,例如。

    var foo = 1, bar = foo;
    
  • 首先声明所有变量,然后将值分配给所有变量:

    var var1, var2, /* ..., */ varN;
    var1 = var2 = /* ... = */ varN = value;
    

    您可以在一个语句中执行此操作,并避免重复最后一个变量,例如

    var foo, bar = foo = 1;
    
  • 如果您真的想避免重复变量和值,可以尝试destructuring assignment [].fill

    var [var1, /*...*/ varN] = new Array(n).fill(value);
    

    但我不推荐它,因为它会创建一个无用的阵列。

答案 1 :(得分:4)

这不是很好,但这里有一个有趣的选择,干嘛:

Mercedes

(function(){ with ({_: 1}) var x = _, y = _; }()); 语句创建一个事实上的临时with变量,我们仅将其应用于_语句,以确保没有其他副作用。这会重复var,但避免重复任何有意义的事情。但是,这是一个糟糕的选择,因为(a)它使用_来杀死优化器,(b)由于使用with而在严格模式下不支持它,而(c)它依赖于{{ 1}}的范围语义,我们都试图从现在开始使用withvar来解决这个问题。

我想我们可以使用这个更连贯的ES6等价物。

let

但是,我觉得在同一行中利用const(function(){ { let _ = 1; var x = _, y = _; } }()); 的不同语义会更加错误。

忘记我们曾经有过这样的思路。

如果要声明两个变量并使用单个语句中的单个表达式初始化它们,则唯一合理的语法选项如下。没有选项可以避免重复变量名而不涉及其他变量或对象。

var

它有效,但它与ES6 let关键字不兼容,因为(function(){ var bar, foo = bar = 1; }()); 未由声明(const)分配,而是由子表达式{{{ 1}})。使用bar作为单个语句,没有受支持的方法来实现此目的。

const bar
bar = 1

多行版本显然没有这样的问题。对于它的价值,我也发现它更容易阅读。

const

答案 2 :(得分:1)

您可以使用销毁作业

(function(){
  var [foo, bar] = [1, 1];
  console.log(foo, bar)
}());